如何获取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 HRESULT
和 IStaticPortMapping
作为输出参数的文档。但该方法已进行参数重写。在 COM 方法分派中,框架会检查实际的 return 值并在失败时引发异常。但这都是在后台完成的。
我在 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 HRESULT
和 IStaticPortMapping
作为输出参数的文档。但该方法已进行参数重写。在 COM 方法分派中,框架会检查实际的 return 值并在失败时引发异常。但这都是在后台完成的。