我在控制台应用程序中调用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;
答案 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可能会导致 不可预测的行为和讨厌的运行时故障。