2016-02-26 5 views
1

Я использую сиэтл в окнах 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 как выходной параметр. Но метод подвергся перезаписи параметров. Рамка в отправке метода COM проверяет фактическое возвращаемое значение и вызывает исключение в случае сбоя. Но все это делается на заднем плане.

 Смежные вопросы

  • Нет связанных вопросов^_^