Модель программирования Component Object Model. Разработка COM-сервера, страница 6

В текст, приведенный ниже, надо подставить идентификаторы, соответствующие вашей регистрации, а также ваш путь к файлу MyCom.dll.

REGEDIT

HKEY_CLASSES_ROOT\MyCom.CoSay\CLSID = {9B865820-2FFA-11d5-98B4-00E0293F01B2}

HKEY_CLASSES_ROOT\CLSID\{9B865820-2FFA-11d5-98B4-00E0293F01B2} = MyCom.CoSay

HKEY_CLASSES_ROOT\CLSID\{9B865820-2FFA-11d5-98B4-00E0293F01B2}\InprocServer32 = D:\MyCom\Debug\MyCom.dll

Обратите внимание на то, что текст каждой из трех команд не должен разрываться символами перехода на другую строку. Здесь я вынужден делать переносы, которых не должно быть в вашем файле. Символы присвоения (=) должны быть окружены пробелами. Сохраните и закройте файл. Теперь для регистрации сервера и вложенного в него класса COM-объекта надо дважды щелкнуть по имени файла MyCom.reg в окне Windows File Manager или Windows Explorer и согласиться с реакцией системы типа "Вы действительно хотите...". После этого соберите проект, дав команду Build4Build.

Процесс сборки должен пройти без ошибок. При осуществлении компоновки (Linking) в окне Output должна появиться строка:

Creating library Debug/MyCom.lib and object Debug/MyCom.exp

которая свидетельствует о том, что DEF-файл воспринят и участвует в построении проекта. Если вы не видите этой строки, то выполните шаги по настройке проекта, которые описаны выше в разделе "Файл описания DLL", и повторите процедуру построения. Теперь наш простейший DLL COM-сервер зарегистрирован и готов к использованию.

Разработка клиентского приложения

Для разработки минимального приложения, способного найти DLL COM inproc-сервер, можно начать с заготовки простого приложения консольного типа, инициализировать системные COM DLL и обратиться к ним с просьбой найти наш COM-объект и загрузить DLL в адресное пространство нашего процесса. Все это делается при вызове функции CoGetClassObject из семейства COM API.

Обратите внимание на то, что нам не надо изменять настройки проекта (Project4Settings) и указывать компоновщику на необходимость подключения DLL, а также указывать ее локальный или сетевой адрес. Собственно в этом и есть главная заслуга COM. Приложение-клиент можно перенести на другую машину и, если там зарегистрирован наш COM-объект, то он будет найден и правильно загружен. Функция CoGetClassObject одновременно с поиском и загрузкой DLL COM-сервера возвращает адрес запрошенного интерфейса. В нашем случае — это ISay. Имея адрес интерфейса, можно обращаться к его методам, управляя таким образом объектом.

1.  Создайте новый проект типа Win32 с именем SayClient;

2.  На странице Application Settings выберите тип Console Application и флаг Empty project;

3.  Добавьте в проект новый файл с именем SayClient.cpp;

4.  Скопируйте из папки предыдущего проекта и вставьте в папку текущего проекта файл guids.h. Подключите его к проекту;

5.  Введите в файл SayClient.cpp текст единственной функции main.

#include "guids.h"

void main()

{

CoInitialize(0);  // Инциализация COM Library

ISay *pSay; // Сюда хотим записать адрес интерфейса

//=== Пытаемся найти и загрузить COM DLL-сервер, а также получить адрес

//=== вложенного интерфейса, указав два идентификатора CLSID_CoSay и IID_ISay

HRESULT hr = CoGetClassObject (CLSID_CoSay,

CLSCTX_INPROC_SERVER, 0, IID_ISay, (void**)&pSay);

if (FAILED(hr))

{

MessageBox (0, "Could not get class object!", "CoGetClassObject", MB_OK);

CoUninitialize();

return;

}

pSay->Say(); // В случае успеха командуем объектом

BSTR word = SysAllocString (L"I hear you well");

pSay->SetWord (word); SysFreeString (word);

pSay->Say();

pSay->Release();    // Освобождаем интерфейс

CoUninitialize(); // Закрываем и выгружаем COM Library

}

Запустите приложение (Ctrl+F5) и, если вы не допустили какой-либо неточности, то должны увидеть окно сообщения со строкой "Hi, there...". После нажатия клавиши Enter должно появиться другое окно с текстом "I hear you well". Этот текст задан клиентским приложением, а воспринят и воспроизведен COM-объектом. Если объект не работает, то терпеливо проверьте все этапы создания сервера. В модели COM существует довольно много мест, где можно допустить ошибку. Наиболее вероятны ошибки в процессе регистрации.