

| стрелялки |
| спорт |
| драки |
| стратегии |
| гонки |
| логические |
| азартные |
| аркады |
| эротические |
| фильмы онлайн |
| Интерфейс IDispatch |
|
Не все языки программирования способны манипулировать указателями, поэтому они не в состоянии управлять интерфейсами COM. Специально в интересах этих языков программирования был разработан интерфейс динамического вызова IDispatch, который позволяет клиентскому приложению обращаться к интересующему методу COM-объекта по его имени. Безусловно, обращение к функции посредством IDispatch - более долгий процесс, чем вызов метода через указатель, так как интерфейс динамического вызова должен позаботиться о преобразовании имени метода в адрес. Но по сравнению с получаемыми удобствами это не такой уж существенный недостаток. Интерфейс динамического вызова описан в модуле System. IDispatch = interface(IUnknown) ['{00020400-0000-0000-C000-000000000046}'] function GetTypeInfoCount(out Count: Integer): HResult; stdcall; function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall; function GetIDsOfNames( const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall; function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall; end; За преобразование имени метода в целочисленный код, называемый диспетчерским идентификатором метода, отвечает функция GetIDsOfNames(). Первый параметр метода, IID, не используется, параметр Names указывает на имя (или массив имен) метода, NameCount содержит количество элементов в массиве имен, а LocaleID - информацию о языке. В результате выполнения метод заполняет массив диспетчерских идентификаторов, число элементов которого зависит от количества имен Names. Указатель на массив целых чисел мы обнаружим в последнем параметре DispIDs. Полученный диспетчерский идентификатор передается в параметр DispID метода Invoke(), который и отвечает за вызов требуемой функции. |
