在控制台应用程序中调用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可能导致不可预测的行为和恶劣的运行时故障。