gpt4 book ai didi

delphi - 使用 "HNetCfg.NATUPnP"Ole对象进行端口转发失败

转载 作者:行者123 更新时间:2023-12-01 22:41:18 25 4
gpt4 key购买 nike

我正在使用转发端口的代码。这段代码在我的 Windows 7 上运行良好;但我无法在 Windows XP 上使用它。

问题更新 1(2012-10-17 07:32:00Z)

这是我的源代码:

uses
ActiveX, oleAuto;

Procedure AddUPnPEntry(Port: Integer; const Name: ShortString; LAN_IP: string);
Var
Nat: Variant;
Ports: Variant;
SavedCW: Word;
Begin
if NOT(LAN_IP = '127.0.0.1') then
begin
try
Nat := CreateOleObject('HNetCfg.NATUPnP');
Ports := Nat.StaticPortMappingCollection;

// Error Raized From Here!!!
ShowMessage(inttostr(Ports.count));

Ports.Add(Port, 'TCP', Port, LAN_IP, True, name);
except
ShowMessage('An Error occured with adding UPnP Ports. The ' + name +
' port was not added to the router. Please check to see if your ' +
'router supports UPnP and has it enabled or disable UPnP.');
end;
end;
End;

procedure TForm1.Button2Click(Sender: TObject);
begin
AddUPnPEntry(1234, 'Hello3', '192.168.1.1');
end;

AV 错误消息:

Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x00504876: read of address 0x00000000'.

最佳答案

如果您在访问 count 属性时遇到访问冲突,这意味着 IStaticPortMappingCollection IUPnPNAT.get_StaticPortMappingCollection 返回的接口(interface)方法为nil,这可能是由于您的设备不支持 UPnP、设备上未启用 UPnP、未安装/激活 UPnP 用户界面等多种原因造成的。

无论如何,为了防止这种异常(访问冲突),您必须在使用属性或方法之前检查它返回的值,在这种情况下您可以使用 VarIsClear功能如下:

try
Nat := CreateOleObject('HNetCfg.NATUPnP');
Ports := Nat.StaticPortMappingCollection;

if not VarIsClear(Ports) then
begin
//do something
ShowMessage(inttostr(Ports.count));
Ports.Add(Port, 'TCP', Port, LAN_IP, True, name);
end;

except on E:Exception do
ShowMessage('An Error occured with adding UPnP Ports. '+E.Message);
end;

关于delphi - 使用 "HNetCfg.NATUPnP"Ole对象进行端口转发失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12805067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com