我编写了一组在正常应用程序中工作正常的插件。但是当我尝试在服务应用程序中使用它们时,我的服务在达到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;
答案 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
。然后我取消注册并重新注册了服务器。普雷斯托!不太清楚为什么,但它对我有用。