рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕

рдХрднреА-рдХрднреА рд╣рдорд╛рд░реЗ COM рдШрдЯрдХ рдХреЛ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдПрдХ рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреА рдЪрд╛рд╣рд┐рдП рдпрд╛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпреЛрдЬрдирд╛ рд╕рд░рд▓ рд╣реИ: рдШрдЯрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдШрдЯрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдШрдЯрдХ рдмрджрд▓реЗ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрдХреНрд╖ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реЛрддреЗ рд╣реИрдВред


рдЖрд╡реЗрджрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬреБрдЕрд▓ рдмреЗрд╕рд┐рдХ рдпрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓ рдмреЗрд╕рд┐рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реАрдмреАрдПрд╕рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред


рдпрд╣рд╛рдБ IDispatch рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдорд╛рд░реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдШрдЯрдХ рд╡рд┐рдирдореНрд░рддрд╛рдкреВрд░реНрд╡рдХ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреА рдорд╛рдореВрд▓реА рднреВрдорд┐рдХрд╛ рдЧреНрд░рд╣рдг рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдПрдХ рдЫреЛрдЯреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрд╡рдЪрд╛рд▓рди рд╕рд░реНрд╡рд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧреАред


рд╣рдо FreeBASIC рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдШрдЯрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗред


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ


рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ IDispatch рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ COM рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред


рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣рдо рдмрд╛рдж рдореЗрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЗ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ:


 Class CallBack Function CallBack(Param) '    WScript.Echo Param CallBack = 0 End Function End Class 

рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ CallBack рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, CallBack рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд╛рд╕ рдХрд░реЗрдВред


 '  Dim Component Set Component = CreateObject("BatchedFiles.TestCOMServer") '    ,      Dim objCallBack Set objCallBack = New CallBack '       Component.SetCallBack objCallBack, "" '       result = Component.InvokeCallBack() WScript.Echo result Set objCallBack = Nothing Set Component = Nothing 

IDispatch


рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдСрдЯреЛрдореЗрд╢рди рдХреА рдареЛрдХрд░ рд╣реИред рдЖрдорддреМрд░ рдкрд░, IDispatch рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ITypeInfo->Invoke CreateStdDispatch рдпрд╛ CreateStdDispatch рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд CreateStdDispatch рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рди рд╕рд░реНрд╡рд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╣рдорд╛рд░рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, IDipatch рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред


рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ "oaidl.bi" рд╢реАрд░реНрд╖рдХ рдореЗрдВ рд╣реИ (рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдВрдЯ рдФрд░ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ):


 Type IDispatch As IDispatch_ Type LPDISPATCH As IDispatch Ptr Type IDispatchVtbl '   IUnknown Dim InheritedTable As IUnknownVtbl GetTypeInfoCount As Function( _ ByVal this As IDispatch Ptr, _ ByVal pctinfo As UINT Ptr _ )As HRESULT GetTypeInfo As Function( _ ByVal this As IDispatch Ptr, _ ByVal iTInfo As UINT, _ ByVal lcid As LCID, _ ByVal ppTInfo As ITypeInfo Ptr Ptr _ )As HRESULT GetIDsOfNames As Function( _ ByVal this As IDispatch Ptr, _ ByVal riid As Const IID Const Ptr, _ ByVal rgszNames As LPOLESTR Ptr, _ ByVal cNames As UINT, _ ByVal lcid As LCID, _ ByVal rgDispId As DISPID Ptr _ )As HRESULT Invoke As Function( _ ByVal this As IDispatch Ptr, _ ByVal dispIdMember As DISPID, _ ByVal riid As Const IID Const Ptr, _ ByVal lcid As LCID, _ ByVal wFlags As WORD, _ ByVal pDispParams As DISPPARAMS Ptr, _ ByVal pVarResult As VARIANT Ptr, _ ByVal pExcepInfo As EXCEPINFO Ptr, _ ByVal puArgErr As UINT Ptr _ )As HRESULT End Type Type IDispatch_ lpVtbl As IDispatchVtbl Ptr End Type 

рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ GetIDsOfNames рдФрд░ Invoke рдлрд╝рдВрдХреНрд╢рди рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВред


GetIDsOfNames


рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреА рдкреНрд░реЗрд╖рдг рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ DISPID ред DISPID , LONG рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рдирд╛рдо рд╣реИред


рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, DISPID рдмрд╕ рдПрдХ рдЕрдиреБрдХреВрд▓рди рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рд▓рд╛рдЗрди DISPID рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ DISPID ред рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП, DISPID рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред


рдкреИрд░рд╛рдореАрдЯрд░рд╡рд┐рд╡рд░рдг
riidрдЖрд░рдХреНрд╖рд┐рддред IID_NULL рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
rgszNamesрдлрд╝рдВрдХреНрд╢рди рдирд╛рдореЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред
CNAME рдЙрдкрд▓рдмреНрдзрд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░ред
LCIDрд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреА рдЬрд╛рдирдХрд╛рд░реАред
rgDispIdрдПрдХ рд╕рд░рдгреА рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдпрд╛ DISPID_UNKNOWN рдпрджрд┐ рдпрд╣ рдЙрд╕ рдирд╛рдо рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ DISPID_UNKNOWN ред

рдЖрд╣реНрд╡рд╛рди


рдкреНрд░реЗрд╖рдг рджреНрд╡рд╛рд░рд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред


рдкреИрд░рд╛рдореАрдЯрд░рд╡рд┐рд╡рд░рдг
dispIdMemberрдмреБрд▓рд╛рдпрд╛ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдбрд┐рд╕реНрдкреИрдЪрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ред
riidрдЖрд░рдХреНрд╖рд┐рддред IID_NULL рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
LCIDрд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреА рдЬрд╛рдирдХрд╛рд░реАред
wFlagsрдЭрдВрдбреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпред рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдВрдкрддреНрддрд┐ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DISPATCH_PROPERTYGET рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ - DISPATCH_PROPERTYPUT , рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - DISPATCH_PROPERTYPUT , рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ - DISPATCH_PROPERTYPUTREF ред
pDispParamsрдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд╕рдВрд░рдЪрдирд╛ред
pVarResultрд╕реВрдЪрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ VARIANT рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓рд╛рдПрдЧрд╛ред
pExcepInfoрд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЕрдкрд╡рд╛рдж рд▓рд┐рдЦреЗрдЧрд╛ред NULL рдХреЛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ NULL ред
puArgErrрддрд░реНрдХреЛрдВ рдХреЗ рд╕реВрдЪрдХ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗред NULL рдХреЛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ NULL ред

DISPPARAMS


рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рддрдерд╛рдХрдерд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ VARIANT рдореЗрдВ рдкреИрдХ рдХрд┐рдП рдЧрдП рд╣реИрдВред


 Type tagDISPPARAMS '      rgvarg As VARIANTARG Ptr '      rgdispidNamedArgs As DISPID Ptr '    cArgs As UINT '    cNamedArgs As UINT End Type Type DISPPARAMS As tagDISPPARAMS 

рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд╛рдорд┐рдд рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп NULL рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред


рдЕрдВрдЧ


рд▓рд┐рдкрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдШрдЯрдХреЛрдВ рдХреЛ рд╕реАрдзреЗ рдпрд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ IDipatch рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


ITestCOMServer рдЗрдВрдЯрд░рдлрд╝реЗрд╕


ITestCOMServer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ITestCOMServer рдирд┐рд░реНрдорд╛рдг рджреЛ рдлрд╝рдВрдХреНрд╢рди SetCallBack рдФрд░ InvokeCallBack ред рдкрд╣рд▓рд╛ рдСрдЯреЛрдореЗрд╢рди рд╕рд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛, рджреВрд╕рд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред


 Type ITestCOMServer As ITestCOMServer_ Type LPITESTCOMSERVER As ITestCOMServer Ptr Type ITestCOMServerVirtualTable '   IDispatch Dim InheritedTable As IDispatchVtbl Dim SetCallBack As Function( _ ByVal this As ITestCOMServer Ptr, _ ByVal CallBack As IDispatch Ptr, _ ByVal UserName As BSTR _ )As HRESULT Dim InvokeCallBack As Function( _ ByVal this As ITestCOMServer Ptr _ )As HRESULT End Type Type ITestCOMServer_ Dim pVirtualTable As ITestCOMServerVirtualTable Ptr End Type 

рдХрдХреНрд╖рд╛ TestCOMServer


рдЕрдм рдЖрдк COM - рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 Type TestCOMServer '      Dim pVirtualTable As ITestCOMServerVirtualTable Ptr '   Dim ReferenceCounter As ULONG '    Dim CallBackObject As IDispatch Ptr '   Dim UserName As BSTR End Type 

рдлрдВрдХреНрд╢рди рд╕реЗрдЯреЗрд▓рдмреИрдХ


SetCallBack рдлрд╝рдВрдХреНрд╢рди SetCallBack рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд░рд▓ рд╣реИ: рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд рд╕реНрд╡рдЪрд╛рд▓рди рд╕рд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред


 Function TestCOMServerSetCallBack( _ ByVal pTestCOMServer As TestCOMServer Ptr, _ ByVal CallBack As IDispatch Ptr, _ ByVal UserName As BSTR _ )As HRESULT '      ,      If pTestCOMServer->CallBackObject <> NULL Then IDispatch_Release(pTestCOMServer->CallBack) End If pTestCOMServer->CallBackObject = CallBack '    If pTestCOMServer->CallBackObject <> NULL Then IDispatch_AddRef(pTestCOMServer->CallBack) End If '    SysFreeString(pTestCOMServer->UserName) '      pTestCOMServer->UserName = SysAllocStringLen(UserName, SysStringLen(UserName)) Return S_OK End Function 

InvokeCallBack рдлрд╝рдВрдХреНрд╢рди


рд▓реЗрдХрд┐рди InvokeCallBack рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░рдиреА рд╣реЛрдЧреАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рди рд╕рд░реНрд╡рд░ рдХреЗ CallBack рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдбрд┐рд╕реНрдкреИрдЪрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


 Function TestCOMServerInvokeCallBack( _ ByVal pTestCOMServer As TestCOMServer Ptr _ )As HRESULT If pTestCOMServer->CallBack = NULL Then Return E_POINTER End If '    Const cNames As UINT = 1 '     Dim rgszNames(cNames - 1) As WString Ptr = {@"CallBack"} '   DISPID Dim rgDispId(cNames - 1) As DISPID = Any Dim hr As HRESULT = IDispatch_GetIDsOfNames( _ pTestCOMServer->CallBackObject, _ @IID_NULL, _ @rgszNames(0), _ cNames, _ GetUserDefaultLCID(), _ @rgDispId(0) _ ) If FAILED(hr) Then MessageBoxW(NULL, "  DISPID", NULL, MB_OK) Return E_FAIL End If 

рдлрд╝рдВрдХреНрд╢рди рдХреА DISPID рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  '     ┬л, %UserName%┬╗ Dim Greetings As BSTR = SysAllocString(", ") Dim GreetingsUserName As BSTR = Any VarBstrCat(Greetings, pTestCOMServer->UserName, @GreetingsUserName) Const ParamsCount As Integer = 1 '    Dim varParam(ParamsCount - 1) As VARIANT = Any For i As Integer = 0 To ParamsCount - 1 VariantInit(@varParam(i)) Next '   тАФ  varParam(0).vt = VT_BSTR varParam(0).bstrVal = GreetingsUserName Dim Params(0) As DISPPARAMS = Any Params(0).rgvarg = @varParam(0) Params(0).cArgs = ParamsCount Params(0).rgdispidNamedArgs = NULL Params(0).cNamedArgs = 0 '      Dim VarResult As VARIANT = Any Dim ExcepInfo As EXCEPINFO = Any Dim uArgErr As UINT = Any '     hr = IDispatch_Invoke( _ pTestCOMServer->CallBackObject, _ rgDispId(0), _ @IID_NULL, _ GetUserDefaultLCID(), _ DISPATCH_METHOD, _ @Params(0), _ @VarResult, _ NULL, _ NULL _ ) '    For i As Integer = 0 To ParamsCount - 1 VariantClear(@varParam(i)) Next SysFreeString(Greetings) Return S_OK End Function 

рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде, рдПрдХ рдШрдЯрдХ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рдШрдЯрдХ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИред


рд▓рд┐рдкрд┐рдпреЛрдВ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡реЗ ProgID рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреВрд░реА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░реА рдХрд╣рд╛рдиреА рд╣реИред


рд╕рдВрджрд░реНрдн


Github рд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб: https://github.com/zamabuvaraeu/TestCOMServer


PS рдХрд┐рд╕реА рддрд░рд╣ рдмреЗрд╕рд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдореЗрдВ VBScript рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдФрд░ рдХреБрдЫ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi468889/


All Articles