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

问题描述:

我在Windows 10 64位中使用西雅图。如何获取IStaticPortMappingCollection.Add的返回值是否返回?

我尝试通过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; 
+0

您的_变量命名约定是非标准的,非常光栅。 –

Ports.Add()

返回IStaticPortMapping接口。所以,你应该写:

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

你一直在寻找的文件显示Add返回一个HRESULT,而IStaticPortMapping作为out参数。但该方法已经受到参数重写的影响。在COM方法调度中,框架检查实际返回值并在发生故障时引发异常。但是,这些都是在后台完成的。