Дайте теоретическое объяснение типу 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