使用"HNetCfg.NATUPnP"Ole对象失败的端口转发

Sha*_*eri 2 delphi port ole forwarding

我正在使用代码转发端口.此代码在My 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;
Run Code Online (Sandbox Code Playgroud)

AV错误消息:

Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x00504876: read of address 0x00000000'.
Run Code Online (Sandbox Code Playgroud)

RRU*_*RUZ 8

如果您遇到访问冲突,当您访问count属性时,这意味着该方法IStaticPortMappingCollection返回的界面IUPnPNAT.get_StaticPortMappingCollectionnil,这可能是由于设备不支持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;
Run Code Online (Sandbox Code Playgroud)