如何获取IStaticPortMappingCollection.Add的return值return与否?

How to get the return value of IStaticPortMappingCollection.Add return or not?

我在 windows 10 64 位中使用 seattle。

我尝试通过 upnp 转发端口并获得 return 值。端口转发工作正常,但以下行使 'could not convert variant of type (dispatch) into type (integer)' window.

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

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

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 // [=14=]000000
  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;

Ports.Add() return 一个 IStaticPortMapping 接口。所以你应该写:

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

您一直在查看显示 Add returning HRESULTIStaticPortMapping 作为输出参数的文档。但该方法已进行参数重写。在 COM 方法分派中,框架会检查实际的 return 值并在失败时引发异常。但这都是在后台完成的。