2012-03-16 65 views
1

我得到的錯誤,當我在我的控制檯應用程序異常EOleSysError模塊

異常EOleSysError在CoInitialize的調用AddExceptionToFirewall模塊沒有被調用

如何解決爲什麼我即使在使用子句中使用ComObj,ActiveX也會出現此錯誤?

Procedure AddExceptionToFirewall(Const Caption, Executable: String); 
     const 
     NET_FW_PROFILE2_DOMAIN = 1; 
     NET_FW_PROFILE2_PRIVATE = 2; 
     NET_FW_PROFILE2_PUBLIC = 4; 
     NET_FW_IP_PROTOCOL_TCP = 6; 
     NET_FW_ACTION_ALLOW = 1; 
     var 
     fwPolicy2  : OleVariant; 
     RulesObject : OleVariant; 
     Profile  : Integer; 
     NewRule  : OleVariant; 
     begin 
     Profile    := NET_FW_PROFILE2_PRIVATE OR NET_FW_PROFILE2_PUBLIC; 
     fwPolicy2   := CreateOleObject('HNetCfg.FwPolicy2'); 
     RulesObject   := fwPolicy2.Rules; 
     NewRule    := CreateOleObject('HNetCfg.FWRule'); 
     NewRule.Name  := Caption; 
     NewRule.Description := Caption; 
     NewRule.Applicationname := Executable; 
     NewRule.Protocol := NET_FW_IP_PROTOCOL_TCP; 
     NewRule.Enabled := TRUE; 
     NewRule.Profiles := Profile; 
     NewRule.Action := NET_FW_ACTION_ALLOW; 
     RulesObject.Add(NewRule); 
    end; 

回答

5

在嘗試創建COM對象之前,您需要在應用程序中調用OleInitialize(或OleInitializeEx)。

MSDN:OleInitialize function 初始化所述當前公寓COM庫,識別 併發模型爲單螺紋單元(STA),並且使得在下面的說明部分中所描述 附加功能。 應用程序必須初始化COM庫,然後才能調用除CoGetMalloc和內存分配 函數以外的庫函數COM 。

我這樣做是我的主要單位:

initialization 
    OleInitialize(nil); 

finalization 
    OleUninitialize; 

此功能在ActiveX單元(通過外部),但不是由設備自動調用。其他單位可能會這樣稱呼它。這取決於你的功能運行的時間。

這是一個關於調用OleInitialize兩次的Stackoverflow問題。

另外請注意,這是線程特定的。如果正在運行此函數的其他線程正在運行,則需要在該線程上調用OleInitialize。

這裏是另一個很好的頁面,進入了很多細節:Inside the COM Client

從網頁A相關報價:

在一個標準的Delphi EXE COM應用,CoInitialize的/ Ex和 CoUninitialize是自動從ComObj模塊中調用。 CoInitialize/Ex進程通過從TApplication.Initialize調用的InitProc 初始化序列進行鏈接。 因此,調用Application.Initialize(通常在 DPR文件中)作爲EXE應用程序中的第一條語句很重要。

忘記打電話給在Application.Initialize通常是 討厭「的CoInitialize沒有被調用」的第一個語句 ,試圖使COM調用,或者更具體地說,第一 語句錯誤的影響,出口/導入一個COM接口指針。在不同的 筆記中,ComObj僅針對EXE調用CoInitialize/Ex,而不針對DLL。 A DLL的生命週期和線程要求是其主機 應用程序的子集。因此,主機 應用程序負責在調用到DLL 應用程序之前初始化COM運行時。在DLL中顯式調用CoInitialize/Ex可能會導致 不可預知的行爲和令人討厭的運行時失敗。