Разработка
клиентского приложения
Для разработки
минимального приложения, способного найти DLL COM inproc-сервер, можно начать
с заготовки простого приложения консольного типа, инициализировать системные
COM DLL и обратиться к ним с просьбой найти наш СОМ-объект и загрузить DLL в
адресное пространство нашего процесса. Все это делается при вызове функции CoGetclassObject
из семейства сом API. Обратите внимание на то, что нам не надо изменять настройки
проекта (Project > Settings) и указывать компоновщику на необходимость
подключения DLL, а также указывать ее локальный или сетевой адрес. Собственно,
в этом и есть главная заслуга СОМ. Приложение-клиент можно перенести на другую
машину, и если там зарегистрирован наш СОМ-объект, то он будет найден и правильно
загружен. Функция CoGetclassObject одновременно с поиском и загрузкой DLL СОМ-серве-ра
возвращает адрес запрошенного интерфейса. В нашем случае — это isay. Имея адрес
интерфейса, можно обращаться к его методам, управляя, таким образом, объектом.
- Создайте новый проект
типа Win32 с именем SayClient.
- На странице Application
Settings выберите тип Console Application и флаг Empty project.
- Добавьте в проект новый
файл с именем SayClient.cpp.
- Скопируйте из папки предыдущего
проекта и вставьте в папку текущего проекта файл interfaces.h. Подключите
его к проекту.
- Введите в файл SayClient.cpp
текст единственной функции main:
#include
"interfaces.h"
void
main ()
{
//======
Инциализация COM Library
Colnitialize(0);
//======
Сюда хотим записать адрес интерфейса
ISay
*pSay;
//
Пытаемся найти и загрузить СОМ 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();
//======
Закрываем и выгружаем COM Library
CoUninitialize();
}
Запустите приложение
(Ctrl+F5), и если вы не допустили какой-либо неточности, то должны увидеть окно
сообщения со строкой Hi, there.... После нажатия клавиши Enter должно появиться
другое окно с текстом I hear you well. Этот текст задан клиентским приложением,
а воспринят и воспроизведен СОМ-объектом. Если объект не работает, то терпеливо
проверьте все этапы создания сервера. В модели СОМ существует довольно много
мест, где можно допустить ошибку. Наиболее вероятны ошибки в процессе регистрации.