oleserver.pp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. {$mode objfpc}
  2. {$IFNDEF FPC_DOTTEDUNITS}
  3. unit OleServer;
  4. {$ENDIF FPC_DOTTEDUNITS}
  5. interface
  6. {$IFDEF FPC_DOTTEDUNITS}
  7. uses WinApi.Windows, WinApi.Messages, WinApi.Activex, System.SysUtils, System.Classes, WinApi.Comobj;
  8. {$ELSE FPC_DOTTEDUNITS}
  9. uses Windows, Messages, ActiveX, SysUtils, Classes, ComObj;
  10. {$ENDIF FPC_DOTTEDUNITS}
  11. type
  12. TVariantArray = Array of OleVariant;
  13. TOleServer = class;
  14. TConnectKind = (ckRunningOrNew,
  15. ckNewInstance,
  16. ckRunningInstance,
  17. ckRemote,
  18. ckAttachToInterface);
  19. TServerEventDispatch = class(TObject, IUnknown, IDispatch)
  20. private
  21. FServer : TOleServer;
  22. protected
  23. function QueryInterface(constref IID: TGUID; out Obj): HResult; stdcall;
  24. function _AddRef: Integer; stdcall;
  25. function _Release: Integer; stdcall;
  26. function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
  27. function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
  28. function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  29. NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
  30. function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  31. Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  32. property Server: TOleServer read FServer;
  33. function ServerDisconnect :Boolean;
  34. public
  35. constructor Create(aServer: TOleServer);
  36. end;
  37. PServerData = ^TServerData;
  38. TServerData = record
  39. ClassID: TGUID;
  40. IntfIID: TGUID;
  41. EventIID: TGUID;
  42. LicenseKey: Pointer;
  43. Version: Integer;
  44. InstanceCount: Integer;
  45. end;
  46. TOleServer = class(TComponent, IUnknown)
  47. private
  48. FRemoteMachineName: string;
  49. FServerData: PServerData;
  50. FEventDispatch: TServerEventDispatch;
  51. FEventsConnection: DWord;
  52. protected
  53. function QueryInterface(constref IID: TGUID; out Obj): HResult; stdcall; override;
  54. function _AddRef: Integer; stdcall;
  55. function _Release: Integer; stdcall;
  56. procedure Loaded; override;
  57. procedure InitServerData; virtual; abstract;
  58. function GetServer: IUnknown; virtual;
  59. procedure ConnectEvents(const Obj: IUnknown);
  60. procedure DisconnectEvents(const Obj: Iunknown);
  61. procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); virtual;
  62. function GetConnectKind: TConnectKind;
  63. procedure SetConnectKind(ck: TConnectKind);
  64. function GetAutoConnect: Boolean;
  65. procedure SetAutoConnect(flag: Boolean);
  66. property ServerData: PServerData read FServerData write FServerData;
  67. property EventDispatch: TServerEventDispatch read FEventDispatch write FEventDispatch;
  68. public
  69. constructor Create(AOwner: TComponent); override;
  70. destructor Destroy; override;
  71. procedure Connect; virtual; abstract;
  72. procedure Disconnect; virtual; abstract;
  73. published
  74. property AutoConnect: Boolean read GetAutoConnect write SetAutoConnect;
  75. property ConnectKind: TConnectKind read GetConnectKind write SetConnectKind;
  76. property RemoteMachineName: string read FRemoteMachineName write FRemoteMachineName;
  77. end;
  78. implementation
  79. function TServerEventDispatch.QueryInterface(constref IID: TGUID; out Obj): HResult; stdcall;
  80. begin
  81. end;
  82. function TServerEventDispatch._AddRef: Integer; stdcall;
  83. begin
  84. end;
  85. function TServerEventDispatch._Release: Integer; stdcall;
  86. begin
  87. end;
  88. function TServerEventDispatch.GetTypeInfoCount(out Count: Integer): HResult; stdcall;
  89. begin
  90. end;
  91. function TServerEventDispatch.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
  92. begin
  93. end;
  94. function TServerEventDispatch.GetIDsOfNames(const IID: TGUID; Names: Pointer;
  95. NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
  96. begin
  97. end;
  98. function TServerEventDispatch.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  99. Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  100. begin
  101. end;
  102. function TServerEventDispatch.ServerDisconnect :Boolean;
  103. begin
  104. end;
  105. constructor TServerEventDispatch.Create(aServer: TOleServer);
  106. begin
  107. end;
  108. function TOleServer.QueryInterface(constref IID: TGUID; out Obj): HResult; stdcall;
  109. begin
  110. end;
  111. function TOleServer._AddRef: Integer; stdcall;
  112. begin
  113. end;
  114. function TOleServer._Release: Integer; stdcall;
  115. begin
  116. end;
  117. procedure TOleServer.Loaded;
  118. begin
  119. end;
  120. function TOleServer.GetServer: IUnknown;
  121. begin
  122. end;
  123. procedure TOleServer.ConnectEvents(const Obj: IUnknown);
  124. begin
  125. {$IFDEF FPC_DOTTEDUNITS}WinApi.{$ENDIF}ComObj.InterfaceConnect(Obj, FServerData^.EventIID, FEventDispatch, FEventsConnection);
  126. end;
  127. procedure TOleServer.DisconnectEvents(const Obj: Iunknown);
  128. begin
  129. {$IFDEF FPC_DOTTEDUNITS}WinApi.{$ENDIF}ComObj.InterfaceDisconnect(Obj, FServerData^.EventIID, FEventsConnection);
  130. end;
  131. procedure TOleServer.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
  132. begin
  133. end;
  134. function TOleServer.GetConnectKind: TConnectKind;
  135. begin
  136. end;
  137. procedure TOleServer.SetConnectKind(ck: TConnectKind);
  138. begin
  139. end;
  140. function TOleServer.GetAutoConnect: Boolean;
  141. begin
  142. end;
  143. procedure TOleServer.SetAutoConnect(flag: Boolean);
  144. begin
  145. end;
  146. constructor TOleServer.Create(AOwner: TComponent);
  147. begin
  148. end;
  149. destructor TOleServer.Destroy;
  150. begin
  151. end;
  152. end.