Конференция "Corba" » Обработка COM события, Как прочитать параметры метода? [Delphi, Windows]
 
  • GraySE (21.07.08 16:02) [0]
    Привет!

    Есть обработка событий COM объекта - WebBrowser.
    Подключён к DWebBrowserEvents2. Вот описание интерфейса.

    DWebBrowserEvents2 = dispinterface
     ...
     procedure BeforeNavigate2(const pDisp: IDispatch; var URL: OleVariant; var Flags: OleVariant;
                                 var TargetFrameName: OleVariant; var PostData: OleVariant;
                                 var Headers: OleVariant; var Cancel: WordBool); dispid 250;
     ...
    end;



    Делаю обработку этого метода:


    function TWebBrowserEvents.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
     Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
    var
      P: TDispParams absolute Params; // Это, как я понял параметры метода BeforeNaviagte2
    begin
     case DispID of
       250: // BeforeNavigate2
       begin
         // Вывод заголовков
       end;
     end;
    end;



    Насколько я понял, параметр Params - содержит массив параметров метода BeforeNavigate2 интерфейса DWebBrowserEvents2. Как мне получить к ним доступ?
    Конкретно - мне нужен доступ к заголовкам (параметр Headers). Мне нужно вывести все заголовки, полчаемые от интерфейса.
    Как это сделать? Есть можно - с примером.

    Спасибо.
  • Сергей М. © (21.07.08 20:05) [1]
    unit SHDocVw тебе в руки
  • GraySE (22.07.08 08:59) [2]
    Подсмотрел там.


    var
     P: TVariantArray absolute Params;
     ...
    begin
     ...
     WriteLn(P[1]); // P[1] это URL
     ...



    В итоге вижу пустую строку. Хотя P[1]: OleVariant и должен содержать URL.
  • GraySE (22.07.08 09:21) [3]
    URL я нашёл. Он в P[5] лежит.
    Значет (наверное) заголовки в P[1].

    Как их прочитать ? Нигде этого нет. Подскажите на примере пожалуйста - как вывести массив.
  • Сергей М. © (22.07.08 09:30) [4]

    > должен содержать URL


    Не должен.

    В 1-м параметре, в соответствии с прототипом BeforeNavigate2, должен лежать адрес olevariant-значения (см. префикс
    var

    ), а не само значение.
  • Сергей М. © (22.07.08 09:37) [5]

    > URL я нашёл. Он в P[5] лежит


    Ну конечно в 5-м - соглашение-то stdcall (при вызове их передача происходит справа налево) ...

    Соотв-но заголовки будут лежать по адресу (
    var

    ), указанному в 1-м параметре
  • GraySE (22.07.08 10:52) [6]
    Про stdcall по ходу дела и понял, что справа налево параметры передаются.
    Подскажи пожалуйста... Как получить массив из 1-го параметра (если он есть), и вывести его построчно.
  • Сергей М. © (22.07.08 11:04) [7]
    А чему равно TVarData(P[1]).VType ?
  • GraySE (22.07.08 11:30) [8]
    TVarData(P[1]).VType = 16396
  • Сергей М. © (22.07.08 12:07) [9]
    Тогда, вероятно,  доступ к искомым значениям осуществляется так:

    v: OleVariant;

    ..

    v := PVariant(TVarData(P[1]).VUnknown)^;
 
Конференция "Corba" » Обработка COM события, Как прочитать параметры метода? [Delphi, Windows]
Есть новые Нет новых   [134430   +2][b:0][p:0.001]