Сущность технологии COM



Классы и серверы - часть 7


Заметим, что приведенный код не заботится о том, какой интерфейс объявляется каждым из объектов класса. Он просто отправляет запрос QueryInterface соответствующему объекту класса.

Следующий псевдокод показывает, как API-функция CoGetClassObject устанавливает связь с серверным DllGetClassObject:

// pseudo-code from OLE32.DLL // псевдокод из OLE32.DLL

HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsCtx, COSERVERINFO *pcsi , REFIID riid, void **ppv) { HRESULT hr = REGDB_E_CLASSNOTREG; *ppv = 0; if (dwClsCtx & CLSCTX_INPROC) { // try to perform inproc activation // пытаемся выполнить внутрипроцессную активацию HRESULT (*pfnGCO)(REFCLSID, REFIID, void**) = 0; // look in table of already loaded servers in this process // просматриваем таблицу уже загруженных серверов внутри // этого процесса pfnGCO = LookupInClassTable(rclsid, dwClsCtx); if (pfnGCO == 0) { // not loaded yet! // еще не загружен! // ask class store or registry for DLL name // запрашиваем DLL-имя в хранилище классов или в реестре char szFileName[MAX_PATH]; hr = GetFileFromClassStoreOrRegistry(rclsid, dwClsCtx, szFileName); if (SUCCEEDED(hr)) { // try to load the DLL and scrape out DllGetClassObject // пытаемся загрузить DLL и вытащить DllGetClassObject HINSTANCE hInst = LoadLibrary(szFileName); if (hInst == 0) return CO_E_DLLNOTFOUND; pfnGCO = GetProcAddress(hInst, "DllGetClassObject"); if (pfnGCO == 0) return CO_E_ERRORINDLL; // cache DLL for later use // кэшируем DLL для дальнейшего использования InsertInClassTable(rclsid, dwClsCtx, hInst, pfnGCO); } } // call function to get pointer to class object // вызываем функцию для получения указателя на объект класса hr = (*pfnGCO)(rclsid, riid, ppv); } if ((dwClsCtx & (CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)) && hr == REGDB_E_CLASSNOTREG) { // handle out-of-proc/remote request // обрабатываем внепроцессный/удаленный запрос } return hr; }

Отметим, что реализация CoGetClassObject является единственным местом, откуда вызывается DllGetClassObject.


Содержание  Назад  Вперед