Хочу Вас предупредить, что стартовых действий для COM слишком много и я постараюсь разбить это на шаги как только возможно. Итак, создаем новый проект, как Win 32 Dinamic-Link Library и давайте дадим ему имя MyCom. Дальше на выбор о типе создаваемого проекта давайте дадим имя An empty DLL project, что означает пустой проект. Файлы мы добавим сами. Дальше Finish и после этого у нас есть пустой проект без файлов и классов.
Давайте добавим в проект файл MyCOM.cpp и создадим болванку для загрузки и использования COM
#include "windows.h" STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void** ppv ) { return S_OK; } STDAPI DllCanUnloadNow(void) { return S_OK; }
Функция DllGetClassObject извлекает класс из DLL и для использования COM она нужна, именно к ней будет происходить обращение при вызове другой функции CoGetClassObject, но уже у клиента. Общее её описание вот такое.
STDAPI DllGetClassObject ( REFCLSID rclsid, // Уникальный идентификатор объекта REFIID riid, // Ссылка на интерфейс связанный с объектом LPVOID * ppv // адрес переменной которая получит инфтерфейс );
Обычно запрашивают IID_IClassFactory, чтобы создать объект. Эта функция может вернуть два значения либо S_OK либо CLASS_E_CLASSNOTAVAILABLE, если класс не поддерживается. В случае если произошли ошибки при создании класса, то результат возврата может быть такой.
E_INVALIDARG E_OUTOFMEMORY E_UNEXPECTED
В этой функции должно быть написанно примерно следующее. Создать новый объект на основе класса порожденного от ICLassFactory, запросить у него интерфейс (QueryInterface), обработать все ошибки.
Вот, но мы не сможем реализовать эту функцию пока у нас не будет класса порожденного от IClassFactory. Мы его сделаем попозже. А пока идея в том, что эта функция создает объект и передает его интерфейс.
Вторая функция у нас DllCanUnloadNow. Эта функция ответственна за выгрузку DLL из памяти. У неё всего два кода возврата.
S_OK S_FALSE