模块中的异常EOleSysError

时间:2012-03-16 16:09:58

标签: delphi delphi-7

我在控制台应用程序中调用AddExceptionToFirewall时出现错误

  

CoInitialize模块中的异常EOleSysError未被调用

如何修复它为什么即使在use子句中使用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;

1 个答案:

答案 0 :(得分:5)

在尝试创建COM对象之前,需要在应用程序中调用OleInitialize(或OleInitializeEx)。

  

MSDN:OleInitialize function   初始化当前公寓的COM库,标识   并发模型作为单线程单元(STA),并启用   下面的备注部分中描述的其他功能。   应用程序必须先初始化COM库,然后才能调用COM   CoGetMalloc和内存分配以外的库函数   功能

我在我的主单位这样做:

initialization
  OleInitialize(nil);

finalization
  OleUninitialize;

此功能位于ActiveX单元中(通过外部),但不会由该单元自动调用。可能是其他单位会打电话给这个。这取决于你的功能何时运行。

这是一个Stackoverflow问题,询问是否两次调用OleInitialize

另请注意,这是特定于线程的。如果正在启动运行此函数的其他线程,则需要在该线程上调用OleInitialize。

这是另一个很好的页面,详细介绍:Inside the COM Client

该页面的相关引用:

  

在标准的Delphi EXE COM应用程序中,CoInitialize / Ex和   从ComObj模块中自动调用CoUninitialize。   CoInitialize / Ex进程通过InitProc链接   从TApplication.Initialize调用的初始化序列。   因此,重要的是调用Application.Initialize(通常在   DPR文件)作为EXE应用程序中的第一个语句。

     

忘记调用Application.Initialize的效果通常是   在第一个声明中,讨厌的“CoInitialize没有被调用”错误   尝试进行COM调用,或者更具体地说是第一次调用   导出/导入COM接口指针的语句。在另一个   请注意,ComObj仅针对EXE调用CoInitialize / Ex,而不针对DLL调用CoInitialize / Ex。一个   DLL的生命周期和线程要求是其主机的子集   应用。因此,这是主持人的责任   应用程序在调用DLL之前初始化COM运行时   应用。在DLL中显式调用CoInitialize / Ex可能会导致   不可预测的行为和讨厌的运行时故障。