2011-03-04 77 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