Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何获取IStaticPortMappingCollection的返回值。是否添加返回?_Delphi_Upnp - Fatal编程技术网

Delphi 如何获取IStaticPortMappingCollection的返回值。是否添加返回?

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

我在Windows10中使用64位

我尝试通过upnp转发一个端口并获取返回值。端口转发工作正常,但下面的一行显示“无法将类型(dispatch)的变体转换为类型(integer)”窗口

您可以在以下msdn网页中找到返回值类型

整个代码是

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变量命名约定是非标准的,非常刻板。