Шаг 24 - Создаем DLL

Хочу Вас предупредить, что стартовых действий для 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 

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.