рдХрднреА-рдХрднреА рд╣рдорд╛рд░реЗ COM рдШрдЯрдХ рдХреЛ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдПрдХ рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреА рдЪрд╛рд╣рд┐рдП рдпрд╛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпреЛрдЬрдирд╛ рд╕рд░рд▓ рд╣реИ: рдШрдЯрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдШрдЯрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдШрдЯрдХ рдмрджрд▓реЗ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрдХреНрд╖ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реЛрддреЗ рд╣реИрдВред
рдЖрд╡реЗрджрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬреБрдЕрд▓ рдмреЗрд╕рд┐рдХ рдпрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓ рдмреЗрд╕рд┐рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реАрдмреАрдПрд╕рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдпрд╣рд╛рдБ IDispatch
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдорд╛рд░реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдШрдЯрдХ рд╡рд┐рдирдореНрд░рддрд╛рдкреВрд░реНрд╡рдХ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреА рдорд╛рдореВрд▓реА рднреВрдорд┐рдХрд╛ рдЧреНрд░рд╣рдг рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдПрдХ рдЫреЛрдЯреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрд╡рдЪрд╛рд▓рди рд╕рд░реНрд╡рд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧреАред
рд╣рдо FreeBASIC рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдШрдЯрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ
рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ IDispatch
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ COM рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред
рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣рдо рдмрд╛рдж рдореЗрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЗ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ:
Class CallBack Function CallBack(Param)
рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ CallBack
рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, CallBack
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд╛рд╕ рдХрд░реЗрдВред
IDispatch
рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдСрдЯреЛрдореЗрд╢рди рдХреА рдареЛрдХрд░ рд╣реИред рдЖрдорддреМрд░ рдкрд░, IDispatch
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ITypeInfo->Invoke
CreateStdDispatch
рдпрд╛ CreateStdDispatch
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд CreateStdDispatch
рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рди рд╕рд░реНрд╡рд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╣рдорд╛рд░рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, IDipatch
рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ "oaidl.bi" рд╢реАрд░реНрд╖рдХ рдореЗрдВ рд╣реИ (рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдВрдЯ рдФрд░ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ):
Type IDispatch As IDispatch_ Type LPDISPATCH As IDispatch Ptr Type IDispatchVtbl
рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ GetIDsOfNames
рдФрд░ Invoke
рдлрд╝рдВрдХреНрд╢рди рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВред
GetIDsOfNames
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреА рдкреНрд░реЗрд╖рдг рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ DISPID
ред DISPID
, LONG
рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рдирд╛рдо рд╣реИред
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, DISPID
рдмрд╕ рдПрдХ рдЕрдиреБрдХреВрд▓рди рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рд▓рд╛рдЗрди DISPID
рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ DISPID
ред рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП, DISPID
рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред
рдЖрд╣реНрд╡рд╛рди
рдкреНрд░реЗрд╖рдг рджреНрд╡рд╛рд░рд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
DISPPARAMS
рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рддрдерд╛рдХрдерд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ VARIANT
рдореЗрдВ рдкреИрдХ рдХрд┐рдП рдЧрдП рд╣реИрдВред
Type tagDISPPARAMS
рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд╛рдорд┐рдд рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп NULL
рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред
рдЕрдВрдЧ
рд▓рд┐рдкрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдШрдЯрдХреЛрдВ рдХреЛ рд╕реАрдзреЗ рдпрд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ IDipatch
рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
ITestCOMServer рдЗрдВрдЯрд░рдлрд╝реЗрд╕
ITestCOMServer
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ITestCOMServer
рдирд┐рд░реНрдорд╛рдг рджреЛ рдлрд╝рдВрдХреНрд╢рди SetCallBack
рдФрд░ InvokeCallBack
ред рдкрд╣рд▓рд╛ рдСрдЯреЛрдореЗрд╢рди рд╕рд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛, рджреВрд╕рд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред
Type ITestCOMServer As ITestCOMServer_ Type LPITESTCOMSERVER As ITestCOMServer Ptr Type ITestCOMServerVirtualTable
рдХрдХреНрд╖рд╛ TestCOMServer
рдЕрдм рдЖрдк COM - рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
Type TestCOMServer
рдлрдВрдХреНрд╢рди рд╕реЗрдЯреЗрд▓рдмреИрдХ
SetCallBack
рдлрд╝рдВрдХреНрд╢рди SetCallBack
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд░рд▓ рд╣реИ: рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд рд╕реНрд╡рдЪрд╛рд▓рди рд╕рд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред
Function TestCOMServerSetCallBack( _ ByVal pTestCOMServer As TestCOMServer Ptr, _ ByVal CallBack As IDispatch Ptr, _ ByVal UserName As BSTR _ )As HRESULT
InvokeCallBack рдлрд╝рдВрдХреНрд╢рди
рд▓реЗрдХрд┐рди InvokeCallBack
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░рдиреА рд╣реЛрдЧреАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рди рд╕рд░реНрд╡рд░ рдХреЗ CallBack
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдбрд┐рд╕реНрдкреИрдЪрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
Function TestCOMServerInvokeCallBack( _ ByVal pTestCOMServer As TestCOMServer Ptr _ )As HRESULT If pTestCOMServer->CallBack = NULL Then Return E_POINTER End If
рдлрд╝рдВрдХреНрд╢рди рдХреА DISPID
рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдирд┐рд╖реНрдХрд░реНрд╖
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде, рдПрдХ рдШрдЯрдХ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рдШрдЯрдХ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИред
рд▓рд┐рдкрд┐рдпреЛрдВ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡реЗ ProgID
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреВрд░реА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░реА рдХрд╣рд╛рдиреА рд╣реИред
рд╕рдВрджрд░реНрдн
Github рд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб: https://github.com/zamabuvaraeu/TestCOMServer
PS рдХрд┐рд╕реА рддрд░рд╣ рдмреЗрд╕рд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдореЗрдВ VBScript рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдФрд░ рдХреБрдЫ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред