Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


CoInitialize и CoInitializeEx



Функция CoInitialize инициализирует статические и загружаемые библиотеки СОМ, после чего могут использоваться остальные функции СОМ API. Эта функция принимает один параметр, зарезервированный для использования в будущих версиях СОМ, поэтому его значение должно быть равно null. функция CoInitializeEx была добавлена для поддержки различных потоковых моделей СОМ. До создания Windows NT 4.0 СОМ поддерживала только потоковую модель с раздельным адресным пространством, которая принималась по умолчанию. Функция CoInitializeEx имеет два параметра. Первый из них зарезервирован и всегда должен иметь значение null, а второй определяет одну из потоковых моделей, заданных в перечислении COINIT.

typedef enum tagCOINIT{ COINIT_APARTMENTTHREADED = 0x2, // Использует раздельное адресное пространство // потоков #if (_WIN32_WINNT > = 0x0400 ) || defined(_WIN32_DCOM) // DCOM // These constants are only valid on Windows NT 4.0 COINIT_MULTITHREADED = 0x0, // OLE вызывает объекты из любого потока. COINIT_DISABLE_OLE1DDE = 0x4, // Не использует DDE для поддержки OLE1. COINIT_SPEED_OVER_MEMORY = 0x8, // Для увеличения скорости занимает // больше памяти.#endif // DCOM} COINIT;

 

CoUninitialize

Функция CoUninitialize вызывается, если требуется освободить ресурсы статических и загружаемых библиотек СОМ. Вызов возможен только в том случае, если перед этим произошел успешный вызов функции CoInitialize. С другой стороны, после каждого вызова функции CoInitialize необходимо вызывать функцию CoUninitialize.

CoRegisterClassObject

Функция CoRegisterClassObject вызывается сервером для регистрации фабрик классов как доступных к использованию. Эта функция должна вызываться для каждой фабрики классов, содержащейся в исполняемом коде, причем как можно раньше, желательно до начала цикла обработки сообщений Windows. Функция CoRegisterClassObject может быть использована только в исполняемых файлах (ЕХЕ). Внутризадачные серверы для доступа к их фабрикам классов используют функцию DllGetObject (табл. 5).

Таблица 5. Параметры функции CoRegisterClassObject

Параметр Описание
REFCLSID rclsid CLSID для зарегистрированного класса компонента.
LPUNKNOWN pUnk Указатель на интерфейс IUnknown для зарегистрированного класса компонента.
DWORD dwClsContext Запрашиваемый контекст для выполняемого кода.Может принимать следующие значения: CLSCTX_INPROC_SERVER CLSCTX_INPROC_HANDLER CLSCTX_LOCAL_SERVER CLSCTX_REMOTE_SERVER.
DWORD flags Флаги REGCLS определяют способ создания нескольких экземпляров компонента. Переменная flags может принимать следующие значения: REGCLS_SINGLEUSE REGCLS_MULTIPLEUSE REGCLS_MULTI_SEPARATE.
LPDWORD lpdwRegister Возвращаемое значение, используется при отмене регистрации объекта класса с помощью функции CoRevokeClassObject.

CoGetClassObject

Функция CoGetClassObject используется клиентом СОМ для получения указателя на интерфейс IClassFactory заданного класса компонента. Затем этот указатель может быть использован для создания нескольких экземпляров компонента.

СОМ определит вид сервера — загружаемый (DLL-файл) или выполняемый (ЕХЕ-файл). Если компонент хранится в DLL-файле, то СОМ загрузит его и передаст клиенту указатель на требуемый интерфейс с помощью вызова своей функции DllGetClassObject. Если же компонент содержится в исполняемом файле, который в данный момент не запущен, то СОМ запустит его локально или удаленно, подождет, пока сервер зарегистрирует свои фабрики классов с помощью функции CoRegisterClassObject, a затем возвратит клиенту требуемый интерфейс.

В NT версии 4.0 и выше параметр coserverinfo используется для разрешения создания экземпляра на удаленных системах. Структура coserverinfo позволяет задать имя сервера как имя UNC (например, \\twa_nt), имя DNS (например, www.WidgetWare.com) или IP-адрес (например, 191.51.33.1).

typedef struct _COSERVERINFO { DWORD dwReserved1; LPWSTR pwszName; COAUTHINFO __RPC_FAR *pAuthInfo; DWORD dwReserved2; } COSERVERINFO;

 

В большинстве случаев клиент должен применять сокращенный вариант функции CoCreateInstance, описываемой далее. Приложение клиента может использовать функцию CoGetClassObject в двух случаях. Во-первых, если в этом приложении необходимо создать несколько экземпляров компонентного объекта. Тогда получение только одной копии фабрики классов для их создания будет более эффективным. Во-вторых, если клиенту требуется получить доступ к методу IClassFactory:: LockServer () с целью блокировки в силу каких-либо причин хранилища компонента в памяти. Обычно это опять-таки связано с повышением эффективности. В табл. 6 приведены параметры функции CoGetClassObject.

Таблица 6. Параметры функции CoGetClassObject

Параметр Описание
REFCLSID rclsid Ссылка на CLSID для заданного компонента.
DWORD dwClsContext Запрашиваемый контекст для хранилища сервера. Может принимать одно или несколько из следующих значений: CLSCTX_INPROC_SERVER CLSCTX_INPROC_HANDLER CLSCTX_LOCAL_SERVER CLSCTX_REMOTE_SERVER.
COSERVERINFO pServerInfo Указатель на структуру COSERVERINFO.
REFIID riid Ссылка на IID для интерфейса, который необходимо возвратить из созданного объекта класса. Обычно это IClassFactory. Благодаря этому клиент может создать экземпляр требуемого компонента.
VOID** ppvObj Указатель типа void* на интерфейс, подлежащий возврату

 

CoCreateInstance

Функция CoCreateInstance используется приложением клиента для создания экземпляра заданного класса компонента. Существует вспомогательная функция, называемая CoGetClassObject, предназначенная для получения фабрики классов компонента и последующего использования метода IClassFactory:: CreateInstance() с целью создания экземпляра компонента. Однако вместо выполнения приведенного ниже трех шагового процесса для получения необходимого вам интерфейса лучше использовать функцию CoCreateInstance.

// Функция CoCreateInstance выполняет такие действия: CoGetClassObject(..., & pCF); pCF-> CreateInstance(..., & pInt); pCF-> Release();

 

Параметры функции CoCreateInstance аналогичны параметрам функции CoGetClassObject. Единственное отличие состоит в том, что использование клиентом функции CoCreateInstance приведет к запросу заданного вами интерфейса для компонента (например, IDispatch) вместо указателя на IClassFactory.

Осуществляя поддержку распределенной модели СОМ, функция CoGetClassObject использует ранее зарезервированный параметр для передачи структуры COSERVERINFO. Однако функция CoCreateInstance не имела такого зарезервированного параметра. Поэтому потребовалась новая функция, CoCreateInstanceEx, которая применяется для создания СОМ-объекта на удаленном компьютере. Четвертый параметр этой функции как раз и используется для передачи структуры COSERVERINFO. Формат вызова функции CoCreateInstanceEx аналогичен описанному ранее для вызова функции CoGetClassObject.

В целях повышения производительности при создании экземпляра компонента имеется структура MULTI_QI, задачей которой является разрешение доступа клиенту к QueryInterface для получения нескольких интерфейсов за один вызов. Данная структура позволяет организовывать массив IID, который будет возвращаться вместе с массивом указателей на интерфейсы.

typedef struct tagMULTI_QI { const IID __RPC_FAR *pIID; IUnknown __RPC_FAR *pItf; HRESULT hr; } MULTI_QI;

 

Параметры функций CoCreateInstance и CoCreateInstanceEx приведены в табл. 7 и 8.

Таблица 7. Параметры функции CoCreateInstance

Параметр Описание
REFCLSID rclsid Ссылка на CLSID для заданного компонента.
IUnknown* pUnkOuter При использовании механизма агрегации параметры управляющей среды неизвестны.
DWORD dwClsContext Запрашиваемый контекст для хранилища сервера. Может принимать одно, два или все из следующих значений: CLSCTX_INPROC_SERVER CLSCTX_INPROC_HANDLER CLSCTX_LOCAL_SERVER CLSCTX_REMOTE_SERVER.
REFIID riid Ссылка на IID для заданного интерфейса, который необходимо возвратить из созданного компонентного объекта.
VOID** ppvObj Указатель типа void* на возвращаемый интерфейс.

 

Таблица 8. Параметры функции CoCreateInstanceEx

Параметр Описание
REFCLSID rclsid Ссылка на CLSID для заданного компонента.
IUnknown* pUnkOuter При использовании механизма агрегации параметры управляющей среды неизвестны.
DWORD dwClsContext Запрашиваемый контекст для хранилища сервера. Может принимать одно, два или все из следующих значений: CLSCTX_INPROC_SERVER CLSCTX_INPROC_HANDLER CLSCTX_LOCAL_SERVER CLSCTX_REMOTE_SERVER.
COSERVERINFO* pServerInfo Указатель на структуру COSERVERINFO.
ULONG Количество вызовов QueryInterface, которые необходимо осуществить для обработки структуры MULTI_QI.
MULTI_QI Массив структур MULTI_QI. Получение сразу множества интерфейсов с помощью одного вызова функции более эффективно.

 

DllCanUnloadNow

Функция DllCanUnloadNow используется во внутризадачных серверах. С ее помощью СОМ периодически проверяет, можно ли произвести выгрузку DLL-файла. Функция не имеет параметров и возвращает либо значение S_FALSE, указывающее, что DLL-файл не может быть выгружен, либо S_OK, обозначающее обратное.

DllGetClassObject

Функция DllGetClassObject используется во внутризадачных серверах для обращения к фабрикам классов компонентных объектов. При запросе приложением клиента компонента, хранящегося во внутризадачном сервере, СОМ вызывает точку входа DLL-файла — функцию DllGetClassObject — с параметрами, описанными в табл. 9.

Таблица 9. Параметры функции CoGetClassObject

Параметр Описание
REFCLSID rclsid Ссылка на CLSID для заданного компонента.
DWORD dwClsContext Запрашиваемый контекст для хранилища сервера. Может принимать одно из следующих значений: CLSCTX_INPROC_SERVER CLSCTX_INPROC_HANDLER CLSCTX_LOCAL_SERVER
LPVOID pvReservered Зарезервирован. Должен иметь значение NULL.
REFIID riid Ссылка на IID для интерфейса, который необходимо возвратить из созданного компонентного объекта. Обычно это IClassFactory, и таким образом клиент получает возможность создать экземпляр необходимого компонента.
VOID** ppvObj Указатель типа void* на возвращаемый интерфейс.

 

 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-04-11; Просмотров: 2092; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.013 с.)
Главная | Случайная страница | Обратная связь