如何获取IStaticPortMappingCollection.Add的返回值是否返回?

时间:2016-02-26 05:13:18

标签: delphi upnp

我在Windows 10 64位中使用西雅图。

我尝试通过upnp转发端口并获取返回值。端口转发运行良好,但以下行使得无法将类型(调度)的变体转换为类型(整数)'窗口。

_hResult := _Ports.add(_PortNumber, 'TCP', _PortNumber, Edit1.Text, True, _PortName); 

您可以在以下msdn网页中找到返回值类型。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366148(v=vs.85).aspx

整个代码是

uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Win.ComObj, Vcl.StdCtrls;

procedure TForm1.FormClick(Sender: TObject);
var
  _NAT: Variant;
  _Ports: Variant;
  _PortNumber: Integer;
  _PortName: string;
  _hResult: HRESULT;
begin
  _NAT := CreateOleObject('hnetcfg.natupnp');
  _Ports := _NAT.staticportmappingcollection;

  _PortNumber := 8000;
  _PortName := 'test';

  if VarIsClear(_Ports) then // $00000000
  begin
    Caption := 'error';
  end
  else
  begin
    _hResult := _Ports.add(_PortNumber, 'TCP', _PortNumber, Edit1.Text, True, _PortName);

    if _hResult = S_OK then
    begin
      Caption := 'succeeded';
    end;
  end;
end;

1 个答案:

答案 0 :(得分:0)

Ports.Add()返回IStaticPortMapping接口。所以你应该写:

var
  _Port: Variant;
....
_Port := _Ports.Add(..._);

您一直在查看显示Add返回HRESULTIStaticPortMapping作为输出参数的文档。但该方法已经受到参数重写的影响。 COM方法调度中的框架会检查实际返回值并在发生故障时引发异常。但这都是在后台完成的。