Дайте  теоретическое объяснение типу IDispatch

Previous  Top  Next

    
 

 

Идентификатор интерфейса тип IDispatch, используемый для связи с объектом. Для создания объектов COM, не использующих интерфейс IDispatch, надо использовать функцию CreateComObject.

Руксскими словами: varDispatch        $0009        ссылка на автоматический объект (указатель на интерфейс IDispatch)

 

Автор ответа: Snick_Y2K 

©Drkb::04336

Взято с Vingrad.ru http://forum.vingrad.ru


 

 

"Тип IDispatch" - не звучит. Ты бы сказал, в каком контексте.

 

Вообще, IDispatch - это интерфейс. Если ты заглянешь в System.pas, ты найдешь его делфийское описание:

Code:

IDispatch=interface

.....

end;

 

 

 

Это интерфейс используется для обеспечения "позднего связывания" в COM, то есть вызовов методов(и использования property) когда на момент компиляции их имена не известны. Например:

Code:

var

v:variant;

begin

v:=CreateOleObject("Excel.Appication");

v.Quit;

end;

 

 

 

Как тут вызывается метод Quit? Ведь компилятор совершенно ничего не знает об этом методе, ровно как и о том, что содержится в переменно v. На самом деле, одна эта строчка транслируется компилятором в набор примерно таких вызовов:

Code:

var

v:variant;

begin

v:=CreateOleObject("Excel.Appication");

if TVarData(v).vtType=vtIDispatch then

begin

    pseudo_compiler_generated_IDispatch:IDispatch=TVarData(v).varIDispatch //указатель на интерфейс IDispatch

    cpl_gen_DispID:integer;

    pseudo_compiler_generated_IDispatch.GetIDsOfNames('Quit',1,cpl_gen_DispID);  //получаем числовой индефикатор имени "Quit"

    pseudo_compiler_generated_IDispatch.Invoke(cpl_gen_DispID,....); //вызывает метод по индификатору.

end;

end;

 

 

 

Если использоват IDispatch вместо variant, то все это можно написать самому:

Code:

var

Disp:IDispatch;

DispID:integer;

begin

Disp:=CreateOleObject("Excel.Appication");

Disp.GetIDsOfNames('Quit',1,DispID);  //получаем числовой индефикатор имени "Quit"

Disp.Invoke(DispID,....); //вызывает метод по индификатору.

end;

 

 

 

©Drkb::04337

Автор: Fantasist

Взято с Vingrad.ru http://forum.vingrad.ru