Как правило, вы используете CoCreateInstance()
для создания экземпляра объекта из COM DLL.Когда вы делаете это, нет необходимости сначала загружать библиотеку DLL и получать адреса прок, как вы должны делать с обычной библиотекой DLL.Это связано с тем, что Windows «знает» о типах, которые реализует COM DLL, в какой DLL они реализованы и как их создавать.(Предполагая, конечно, что COM DLL зарегистрирована, что обычно и происходит).
Предположим, у вас есть COM DLL с интерфейсом IDog, который вы хотите использовать.В этом случае,
dog.idl
interface IDog : IUnknown
{
HRESULT Bark();
};
coclass Dog
{
[default] Interface IDog;
};
myCode.cpp
IDog* piDog = 0;
CoCreateInstance(CLSID_DOG, 0, CLSCTX_INPROC_SERVER, IID_IDOG, &piDog); // windows will instantiate the IDog object and place the pointer to it in piDog
piDog->Bark(); // do stuff
piDog->Release(); // were done with it now
piDog = 0; // no need to delete it -- COM objects generally delete themselves
Все эти вещи управления памятью могут быть довольно шероховатыми, и ATL обеспечиваетумные указатели, которые облегчают задачу создания и управления этими объектами:
CComPtr<IDog> dog;
dog.CoCreateInstance(CLSID_DOG);
dog->Bark();
РЕДАКТИРОВАТЬ:
Когда я сказал выше, что:
Windows "знает "о типах, которые реализует COM DLL [...] и какие DLL они реализуют в
... Я действительно не знаю, как именно Windows это знает.Это не волшебство, хотя поначалу это может показаться немного оккультным.
COM-библиотеки поставляются с библиотеками типов, в которых перечислены интерфейсы и классы CoClass, предоставляемые библиотекой.Эта библиотека типов находится в форме файла на вашем жестком диске - очень часто она встроена непосредственно в ту же DLL или EXE, что и сама библиотека.Windows знает, где найти библиотеку типов и саму библиотеку COM, просматривая реестр Windows.Записи в реестре сообщают Windows, где на жестком диске находится DLL.
Когда вы вызываете CoCreateInstance
, Windows ищет clsid в реестре Windows, находит соответствующую DLL, загружает ее и выполняетправильный код в DLL, который реализует COM-объект.
Как эта информация попадает в реестр Windows?Когда COM DLL установлена, она зарегистрирована.Обычно это выполняется с помощью regsvr32.exe , который, в свою очередь, загружает вашу DLL в память и вызывает функцию с именем DllRegisterServer
.Эта функция, реализованная на вашем COM-сервере, добавляет необходимую информацию в реестр.Если вы используете ATL или другой COM-фреймворк, это, вероятно, делается изнутри, чтобы вам не приходилось напрямую взаимодействовать с реестром.DllRegisterServer
нужно вызывать только один раз, во время установки.
Если вы попытаетесь вызвать CoCreateInstance
для COM-объекта, который еще не был зарегистрирован в процессе regsvr32
/ DllRegisterServer
,тогда CoCreateInstance
потерпит неудачу с ошибкой, которая говорит:
Класс не зарегистрирован
К счастью, исправление для этого - просто вызвать regsvr32
на вашем COM-сервереи повторите попытку.