Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Коды ошибок, возвращаемые функцией GetIDsOfNames()




Возвращаемое значение Описание
S_OK Ошибки нет
E_OUTOFMEMORY Недостаточно памяти
DISP_E_UNKNOWNNAME Одно или более имен неизвестны. Возвращаемый массив идентификаторов rgDispId содержит значение DISPID_UNKNOWN для каждого неизвестного имени
DISP_E_UNKNOWNLCID Не распознан идентификатор локализации lcid

 

Главный метод интерфейса IDispatch объявлен так:

 

HRESULT Invoke(

DISPID dispIdMember,     

REFIID riid,             

LCID lcid,               

WORD wFlags,             

DISPPARAMS FAR* pDispParams, 

VARIANT FAR* pVarResult, 

EXCEPINFO FAR* pExcepInfo, 

unsigned int FAR* puArgErr 

);

 

Номер метода передается через параметр dispIdMember, а фактические параметры вызываемого метода – через pDispParams, который представляет собой указатель на структуру. Не вдаваясь в подробное толкование параметров Invoke отметим только, что формирование списка фактических параметров является сравнительно трудоемким занятием. Этих трудностей можно избежать, так как вызывающая программа может и не использовать метод Invoke, что будет рассмотрено позже.

Метод GetTypeInfoCount имеет такую сигнатуру:

 

HRESULT GetTypeInfoCount(

unsigned int FAR* pctinfo 

);

 

позволяет узнать, доступна ли информация о типах данного COM объекта. Если он возвращает значение *pctinfo =1, то информация доступна, а если 0 – то нет.

Получить информацию о типах можно с помощью метода

HRESULT GetTypeInfo(

unsigned int iTInfo,        

LCID lcid,                  

ITypeInfo FAR* FAR* ppTInfo 

);

 

который возвращает информацию через указатель на интерфейс библиотеки типов ppTInfo. 

 

Диспинтерфейс (dispinterface) представляет собой объявление методов, доступных через интерфейс IDispatch. Он позволяет упростить использование методов интерфейса IDispatch благодаря тому, что компилятор в этом случае имеет возможность выполнить контроль типов при вызове методов объекта или обращении к его свойствам. При этом, тем не менее, используется позднее связывание. В конечном итоге вызов методов диспинтерфейса преобразуется в вызов метода Invoke с соответствующими параметрами. Из этого следует, что на самом деле, в отличие от раннего связывания, наличие вызываемого метода или свойства у объекта не проверяется и не может быть проверено на этапе компиляции (в Object Pascal).

 

Замечание. При разработке клиентских приложений на Visual С++, использующих интерфейс IDispatch, прототипы вызываемых методов должны обязательно существовать, хотя при этом все равно используется позднее связывание. Эти прототипы создаются мастерами MVS путем импорта библиотеки типов и создания на основе имеющейся в ней информации «оберток» (wrappers) методов СОМ объекта.

 

Если к объекту, имеющему интерфейс IDispatch, добавить свой собственный интерфейс IMyInterface (custom interface), то мы получим двойственный (дуальный) интерфейс (dual interface) и таблица vtable в этом случае приобретает такой вид:

 

IUnknown::QueryInterface
IUnknown::AddRef
IUnknown::Release
IDispatch::GetIDsOfNames
IDispatch::GetTypeInfo
IDispatch::GetTypeInfoCount
IDispatch::Invoke
IMyInterface::Method1
IMyInterface::Method2
  другие методы IMyInterface

 

 

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

Программисты на языках С++ или Object Pascal могут пользоваться всеми преимуществами раннего связывания благодаря добавлению «обычных» объявлений методов в дополнительном пользовательском интерфейсе (IMyInterface).

Пример описания дуального интерфейса (из MSDN):

// cpp_attr_ref_defaultvalue.cpp

// compile with: /LD

#include <windows.h>

[export] typedef long HRESULT;

[export, ptr, string] typedef unsigned char * MY_STRING_TYPE;

[ uuid("479B29EE-9A2C-11D0-B696-00A0C903487A"),

dual, oleautomation,

helpstring("IFireTabCtrl Interface"),

helpcontext(122), pointer_default(unique) ]

__interface IFireTabCtrl : IDispatch {

[bindable, propget] HRESULT get_Size([out, retval, defaultvalue("33")] long *nSize);

[bindable, propput] HRESULT put_Size([in] int nSize);

};

[ module(name="ATLFIRELib", uuid="479B29E1-9A2C-11D0-B696-00A0C903487A",

version="1.0", helpstring="ATLFire 1.0 Type Library") ];


 










Последнее изменение этой страницы: 2018-04-12; просмотров: 339.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...