服务应用程序和com插件

时间:2011-03-04 12:44:25

标签: delphi com

我编写了一组在正常应用程序中工作正常的插件。但是当我尝试在服务应用程序中使用它们时,我的服务在达到CreateComObject功能时停止。 我可以在服务应用程序中使用COM插件吗? 这是代码:

procedure TWCMService.CreateControllerList;
var
  List: TAutoFreeList<TController>>;
  i: integer;
  Plugin: IPluginInterfaces;
begin
  try
    List := TAutoFreeList<TController>.Create;
    DatabaseModule.IBDatabase1.Connected := true;
    DatabaseModule.SelectControllers(List);
    DatabaseModule.IBDatabase1.Connected := false;
    Plugin := CreateComObject(StringToGuid('{F2959AEC-644F-49E4-9012-B9B3BF34B43F}')) as  IPluginInterfaces;
    for i := 0 to List.Count - 1 do
      begin
        Plugin.Init(StringToGuid(List[i].PluginId));
        FAvailControllers.Add(CreateComObject(Plugin.GetCommunicationPluginGuid) as ICommunicationPlugin);
        FAvailControllers[i].Init(Self as IServiceApplication);
        FAvailControllers[i].SetMAC(List[i].ControllerMAC);
        MessageBox(0, 'Dodany', 'Uwaga', MB_OK);
      end;
    List.Free;
    FAvailControllersCurrentIndex := 0;
    Timer1.Enabled := true;
  except
    raise Exception.Create('WCM Serwis: Error Message');
  end;
end;

5 个答案:

答案 0 :(得分:3)

未经测试,只是在我的头顶...你可能会发现你需要初始化COM(调用coinitialize),这通常是通过Windows应用程序(在应用程序中运行。运行或更高的链) )使用服务applett你不会为你做这件事,你需要自己做。

答案 1 :(得分:0)

可能需要为每个调用CoInitialize的线程初始化COM库 这里描述。 http://chrisbensen.blogspot.com/2007/06/delphi-tips-and-tricks_20.html

答案 2 :(得分:0)

如前所述,您需要确保COM已初始化。但这可能不是主要原因。
您正在使用Interbase并连接到数据库,它可能通过网络与数据库服务器进行通信。 (即使数据库位于同一系统上!)但是Windows服务默认情况下没有网络访问权限,因此您必须在服务中添加对网络功能的依赖性。
您的问题可能与in this question相同,导致此问题重复!

答案 3 :(得分:0)

这可能与安全有关。取决于您的操作系统。服务可能在另一个帐户下运行。此帐户的权限可能不足以创建所需的COM对象。只是猜测。

答案 4 :(得分:0)

你的问题可能与我所遇到的问题相似吗? EIntfCastError 'Interface not supported' when run as a TServiceApplication
创建对象时,即TComObjectFactory.Create我将线程模型从tmSingle更改为tmApartment。然后我取消注册并重新注册了服务器。普雷斯托!不太清楚为什么,但它对我有用。