如何使用 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
RulesObject
是 System::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);
当我在 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
RulesObject
是 System::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);