В текст, приведенный ниже, надо подставить идентификаторы, соответствующие вашей регистрации, а также ваш путь к файлу 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 существует довольно много мест, где можно допустить ошибку. Наиболее вероятны ошибки в процессе регистрации.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.