2011-03-04 79 views
0

我已经写了一组在正常应用程序中正常工作的插件。但是当我尝试在服务应用程序中使用它们时,我的服务在达到CreateComObject函数时停止。 我可以在服务应用程序中使用COM插件吗? 这是代码:服务应用程序和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; 
+1

请正确格式化您的代码。将其粘贴进去,选中它,然后点击{}按钮。 – 2011-03-04 12:48:12

回答

3

未经测试,就在我的头顶......你可能会发现,你需要初始化COM(调用CoInitialize),这通常是为你做同一个Windows应用程序(在应用程序中。运行或更高级别的链)与服务applett你不会有这样做你,你将需要自己做。

0

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

0

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

+0

非常感谢。解决方案很简单。我必须在OnServiceStart事件中插入CoinitializeEx(nil,COINIT_APARTMENTTHREADED),并在OnServiceStop事件中插入Couninitalize。 – 2011-03-05 20:15:48

0

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

+0

对不起,错过了你的评论,你已经得到它的工作。 – Lars 2013-05-11 23:23:01