模块中出现异常EOleSysError



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

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

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

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

MSDN:OleInitialize函数初始化当前单元上的COM库,标识作为单线程单元(STA)的并发模型,并启用以下备注部分所述的附加功能。应用程序必须先初始化COM库,然后才能调用COMCoGetMalloc以外的库函数和内存分配功能。

我在我的主单元中这样做:

initialization
  OleInitialize(nil);
finalization
  OleUninitialize;

此函数位于ActiveX单元中(通过外部),但该单元不会自动调用。其他单位可能会这样称呼。这取决于函数何时运行。

这里有一个关于调用OleInitialize两次的堆栈溢出问题。

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

下面是另一个很好的页面,它包含了很多细节:COM客户端内部

该页面的相关引用:

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

忘记调用Application.Initialize的影响通常是第一条语句出现严重的"CoInitialize尚未调用"错误尝试进行COM调用,或者更具体地说,第一个导出/导入COM接口指针的语句。在另一个注意,ComObj仅对EXE调用CoInitialize/Ex,而不对DLL调用。A.DLL的生存期和线程要求是其主机的子集应用因此,这是东道主的责任在调用DLL之前初始化COM运行时的应用程序应用在DLL中显式调用CoInitialize/Ex可能导致不可预测的行为和恶劣的运行时故障。

最新更新