我在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;
答案 0 :(得分:0)
Ports.Add()
返回IStaticPortMapping
接口。所以你应该写:
var
_Port: Variant;
....
_Port := _Ports.Add(..._);
您一直在查看显示Add
返回HRESULT
和IStaticPortMapping
作为输出参数的文档。但该方法已经受到参数重写的影响。 COM方法调度中的框架会检查实际返回值并在发生故障时引发异常。但这都是在后台完成的。