CallClientInterfaceUnit.pas 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. unit CallClientInterfaceUnit;
  2. {$WARN SYMBOL_PLATFORM OFF}
  3. interface
  4. uses
  5. Windows, Classes, ComObj, Shdocvw, ActiveX, IEBHO_TLB, StdVcl, Registry, CIEBHO;
  6. type
  7. TCallClientInterface = class(TAutoObject, ICallClientInterface, IObjectSafety)
  8. private
  9. FObjectSafetyFlags: DWORD;
  10. protected
  11. procedure OpenTalkingForm(LoginName: OleVariant); safecall;
  12. function GetInterfaceSafetyOptions(const IID: TIID; pdwSupportedOptions,
  13. pdwEnabledOptions: PDWORD): HResult; stdcall;
  14. function SetInterfaceSafetyOptions(const IID: TIID; dwOptionSetMask,
  15. dwEnabledOptions: DWORD): HResult; stdcall;
  16. end;
  17. implementation
  18. uses Variants, ComServ, Sysutils, ComConst, ShellAPI;
  19. //------------------------------------------------------------------------------
  20. procedure TCallClientInterface.OpenTalkingForm(LoginName: OleVariant);
  21. var
  22. ExeFileName: String;
  23. FVar: OleVariant;
  24. Registry: TRegistry;
  25. Handle: HWND;
  26. begin
  27. ExeFileName := '';
  28. {从注册表中读取 BaseURL}
  29. Registry := TRegistry.Create;
  30. try
  31. Registry.RootKey := HKEY_LOCAL_MACHINE;
  32. if Registry.OpenKey(AppKey + CompanyKeyValue, True) then
  33. begin
  34. ExeFileName := Registry.ReadString('ExeFileName');
  35. end;
  36. finally
  37. Registry.Free;
  38. end;
  39. Handle := openmutex(mutex_all_access, False, iAtom);
  40. try
  41. if Handle = 0 then
  42. begin
  43. if MessageBox(0, PChar(AppTitle + ' 还未启动,是否启动?'), '提示', MB_ICONQUESTION or MB_YESNO) = ID_YES then
  44. begin
  45. ShellExecute(0, 'open', PChar('"' + ExeFileName + '"'), nil, nil, SW_SHOWNORMAL);
  46. end;
  47. Exit;
  48. end;
  49. finally
  50. closeHandle(Handle);
  51. end;
  52. FVar := CreateOleObject('RealICQ.RealOAMessengerAutoServer');
  53. try
  54. try
  55. FVar.OpenTalkingForm(LoginName);
  56. except
  57. on E: Exception do MessageBox(0, PChar(E.Message), '错误', MB_ICONERROR);
  58. end;
  59. finally
  60. FVar := Unassigned;
  61. end;
  62. end;
  63. //------------------------------------------------------------------------------
  64. function TCallClientInterface.GetInterfaceSafetyOptions(const IID: TIID;
  65. pdwSupportedOptions, pdwEnabledOptions: PDWORD): HResult;
  66. var
  67. Unk: IUnknown;
  68. begin
  69. if (pdwSupportedOptions = nil) or (pdwEnabledOptions = nil) then
  70. begin
  71. Result := E_POINTER;
  72. Exit;
  73. end;
  74. Result := QueryInterface(IID, Unk);
  75. if Result = S_OK then
  76. begin
  77. pdwSupportedOptions^ := INTERFACESAFE_FOR_UNTRUSTED_CALLER or
  78. INTERFACESAFE_FOR_UNTRUSTED_DATA;
  79. pdwEnabledOptions^ := FObjectSafetyFlags and
  80. (INTERFACESAFE_FOR_UNTRUSTED_CALLER or INTERFACESAFE_FOR_UNTRUSTED_DATA);
  81. end
  82. else begin
  83. pdwSupportedOptions^ := 0;
  84. pdwEnabledOptions^ := 0;
  85. end;
  86. end;
  87. //------------------------------------------------------------------------------
  88. function TCallClientInterface.SetInterfaceSafetyOptions(const IID: TIID;
  89. dwOptionSetMask, dwEnabledOptions: DWORD): HResult;
  90. var
  91. Unk: IUnknown;
  92. begin
  93. Result := QueryInterface(IID, Unk);
  94. if Result <> S_OK then Exit;
  95. FObjectSafetyFlags := dwEnabledOptions and dwOptionSetMask;
  96. end;
  97. initialization
  98. TAutoObjectFactory.Create(ComServer, TCallClientInterface, Class_CallClientInterface,
  99. ciMultiInstance, tmApartment);
  100. end.