如何使用 C++ Builder 在 Windows 防火墙中打开端口?

How to Open Port in Windows Firewall using C++ Builder?

当我在 Borland C++Builder 中编译我的项目时出现错误:

'Add' is not a member of 'Variant'

我尝试使用自动化 API 来做到这一点,但它给了我上面的错误:

const NET_FW_PROFILE2_DOMAIN  = 1;
const NET_FW_PROFILE2_PRIVATE = 2;
const NET_FW_PROFILE2_PUBLIC  = 4;

const NET_FW_IP_PROTOCOL_TCP = 6;
const NET_FW_IP_PROTOCOL_UDP = 17;
const NET_FW_ACTION_ALLOW    = 1;
const NET_FW_RULE_DIR_IN  = 1;
const NET_FW_RULE_DIR_OUT = 2;

Variant fwPolicy2, RulesObject, NewRule;
DWORD Profile;

Profile   = NET_FW_PROFILE2_PRIVATE | NET_FW_PROFILE2_PUBLIC;
fwPolicy2 = CreateOleObject("HNetCfg.FwPolicy2");
RulesObject = fwPolicy2.OlePropertyGet("Rules");
NewRule   = CreateOleObject("HNetCfg.FWRule");
NewRule.OlePropertyGet("Name") = "Text Firewall";
NewRule.OlePropertyGet("Description") = "Text Firewall";
NewRule.OlePropertyGet("Applicationname") = "System_RCC.exe";
NewRule.OlePropertyGet("Protocol")   = NET_FW_IP_PROTOCOL_TCP;
NewRule.OlePropertyGet("LocalPorts") = Edit1->Text;
NewRule.OlePropertyGet("Direction")  = NET_FW_RULE_DIR_OUT;
NewRule.OlePropertyGet("Enabled")   = true;
NewRule.OlePropertyGet("Grouping")  = "";
NewRule.OlePropertyGet("Profiles")  = Profile;
NewRule.OlePropertyGet("Action")  = NET_FW_ACTION_ALLOW;
RulesObject.Add(NewRule);

注意:此代码取自此处:

How to open port in Win7 Firewall using Delphi

RulesObjectSystem::Variant 包装 COM 对象。

在 Delphi 中,(Ole)Variant 为您透明地处理对 COM 对象的属性和方法的访问(编译器将调用转换为对 IDispatch::GetIDsOfNames()IDispatch::Invoke() 的调用接口方法)。这就是为什么您 link 的 Delphi 代码非常简单。

然而,在 C++ 中,您必须使用 Variant::OleProcedure() or Variant::OleFunction() 方法来调用 COM 对象的方法,就像您必须使用 Variant::OleProperty(Get|Set)() 方法来访问 COM 对象的属性一样。 Variant::Ole...() 方法执行与 Delphi 类似的 IDispatch 调用。

此外,在填充NewRule时,您需要使用OlePropertySet()而不是OlePropertyGet()

试试这个:

const NET_FW_PROFILE2_DOMAIN = 1;
const NET_FW_PROFILE2_PRIVATE = 2;
const NET_FW_PROFILE2_PUBLIC = 4;

const NET_FW_IP_PROTOCOL_TCP = 6;
const NET_FW_IP_PROTOCOL_UDP = 17;
const NET_FW_ACTION_ALLOW = 1;
const NET_FW_RULE_DIR_IN = 1;
const NET_FW_RULE_DIR_OUT = 2;

Variant fwPolicy2, RulesObject, NewRule;
DWORD Profile;

Profile = NET_FW_PROFILE2_PRIVATE | NET_FW_PROFILE2_PUBLIC;
fwPolicy2 = CreateOleObject("HNetCfg.FwPolicy2"); RulesObject = fwPolicy2.OlePropertyGet("Rules");
NewRule = CreateOleObject("HNetCfg.FWRule");
NewRule.OlePropertySet("Name", WideString("Text Firewall"));
NewRule.OlePropertySet("Description", WideString("Text Firewall"));
NewRule.OlePropertySet("Applicationname", WideString("System_RCC.exe"));
NewRule.OlePropertySet("Protocol", NET_FW_IP_PROTOCOL_TCP);
NewRule.OlePropertySet("LocalPorts", Edit1->Text);
NewRule.OlePropertySet("Direction", NET_FW_RULE_DIR_OUT);
NewRule.OlePropertySet("Enabled", true);
NewRule.OlePropertySet("Grouping", WideString(""));
NewRule.OlePropertySet("Profiles", Profile);
NewRule.OlePropertySet("Action", NET_FW_ACTION_ALLOW);
RulesObject.OleProcedure("Add", NewRule);