Delphi 如何获取IStaticPortMappingCollection的返回值。是否添加返回?
我在Windows10中使用64位 我尝试通过upnp转发一个端口并获取返回值。端口转发工作正常,但下面的一行显示“无法将类型(dispatch)的变体转换为类型(integer)”窗口 您可以在以下msdn网页中找到返回值类型 整个代码是Delphi 如何获取IStaticPortMappingCollection的返回值。是否添加返回?,delphi,upnp,Delphi,Upnp,我在Windows10中使用64位 我尝试通过upnp转发一个端口并获取返回值。端口转发工作正常,但下面的一行显示“无法将类型(dispatch)的变体转换为类型(integer)”窗口 您可以在以下msdn网页中找到返回值类型 整个代码是 uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, V
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;
Ports.Add()
返回一个IStaticPortMapping
接口。所以你应该写:
var
_Port: Variant;
....
_Port := _Ports.Add(..._);
您已经看到了一些文档,其中显示了Add
返回HRESULT
,以及IStaticPortMapping
作为out参数。但该方法一直受到参数重写的影响。在COM方法分派中,框架确实检查实际返回值,并在失败时引发异常。但这一切都是在后台完成的 Ports.Add()
返回一个IStaticPortMapping
接口。所以你应该写:
var
_Port: Variant;
....
_Port := _Ports.Add(..._);
您已经看到了一些文档,其中显示了
Add
返回HRESULT
,以及IStaticPortMapping
作为out参数。但该方法一直受到参数重写的影响。在COM方法分派中,框架确实检查实际返回值,并在失败时引发异常。但这一切都是在后台完成的 您的uu变量命名约定是非标准的,非常刻板。您的uu变量命名约定是非标准的,非常刻板。