2016-02-26 71 views
1

我在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

您的_變量命名約定是非標準的,非常光柵。 –

回答

0
Ports.Add()

返回IStaticPortMapping接口。所以,你應該寫:

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

你一直在尋找的文件顯示Add返回一個HRESULT,而IStaticPortMapping作爲out參數。但該方法已經受到參數重寫的影響。在COM方法調度中,框架檢查實際返回值並在發生故障時引發異常。但是,這些都是在後臺完成的。