わかりました、私はそれを理解したと思います。
hnetcfg.dll のタイプ ライブラリ ファイルを作成する必要がありました。最初に始めたときはそうしましたが、それ以来、ファイアウォール オブジェクトについて多くのことを学びました。当時は機能しませんでしたが、現在は機能しています。Component|Import Component から独自のファイルを作成できます。そして、ウィザードに従います。
ラッピング コードでは、通常は好まない例外が使用されますが、インターフェイスを返すインターフェイスが、実際に処理できるデータを返しているかどうかを判断する方法がわかりません。誰かが私を正しい方向に向けることができれば改善します。
それでは、コードに移りましょう。Jim の応答に感謝します。
constructor TFirewallUtility.Create;
begin
inherited Create;
CoInitialize(nil);
mxCurrentFirewallProfile := INetFwMgr(CreateOLEObject('HNetCfg.FwMgr')).LocalPolicy.CurrentProfile;
end;
function TFirewallUtility.IsPortInExceptionList(iPortNumber: integer): boolean;
begin
try
Result := mxCurrentFirewallProfile.GloballyOpenPorts.Item(iPortNumber, NET_FW_IP_PROTOCOL_TCP).Port = iPortNumber;
except
Result := False;
end;
end;
function TFirewallUtility.IsPortEnabled(iPortNumber: integer): boolean;
begin
try
Result := mxCurrentFirewallProfile.GloballyOpenPorts.Item(iPortNumber, NET_FW_IP_PROTOCOL_TCP).Enabled;
except
Result := False;
end;
end;
procedure TFirewallUtility.SetPortEnabled(iPortNumber: integer; sPortName: string; xProtocol: TFirewallPortProtocol);
begin
try
mxCurrentFirewallProfile.GloballyOpenPorts.Item(iPortNumber, CFirewallPortProtocalConsts[xProtocol]).Enabled := True;
except
HaltIf(True, 'xFirewallManager.TFirewallUtility.IsPortEnabled: Port not in exception list.');
end;
end;
procedure TFirewallUtility.AddPortToFirewall(sPortName: string; iPortNumber: Cardinal; xProtocol: TFirewallPortProtocol);
var
port: INetFwOpenPort;
begin
port := INetFwOpenPort(CreateOLEObject('HNetCfg.FWOpenPort'));
port.Name := sPortName;
port.Protocol := CFirewallPortProtocalConsts[xProtocol];
port.Port := iPortNumber;
port.Scope := NET_FW_SCOPE_ALL;
port.Enabled := true;
mxCurrentFirewallProfile.GloballyOpenPorts.Add(port);
end;