Теперь нам нужно создать объект. Вот так.
IUnknown* pUnk; hr = pCF->CreateInstance( NULL, IID_IUnknown, (void**) &pUnk ); pCF->Release(); if ( FAILED( hr )) { cout << "Failed to create server instance " << endl; return ; } cout << "Instance created" << endl;
Обратите внимание, что для создания объекта мы используем функции фабрики классов. Мы сами описывали в этой функции процесс создания класса. Помните ?? Ну там new используется.
Ну вот и настал момент когда мы можем получить доступ к интерфейсу. Для этого нужно его описание и его IDD, я просто скопировал код описания из проекта сервера, но можно подключить и H файл с описанием интерфейса, но это на любителя. Для нормального проекта нужно конечно подключать заголовочный файл на случай изменений. Ну Вы меня простите. Упрощаю как могу.
#include "windows.h" #include "iostream.h" #include "initguid.h" DEFINE_GUID(IID_Step, 0x3f5942e2, 0x108b, 0x11d4, 0xb0, 0x50, 0x0, 0x0, 0x1, 0x26, 0x6, 0x96); class IStep : public IUnknown { public: IStep(); virtual ~IStep(); STDMETHOD(MyComMessage) () PURE; }; void main() ......
Вот так. А теперь мы можем и интерфейс попросить :-)
IStep* pStep = NULL; hr = pUnk->QueryInterface( IID_Step, (void**) &pStep); pUnk->Release(); if ( FAILED( hr )) { cout << "QueryInterface() for IStep failed" << endl; CoUninitialize(); return; }
Как видите мы запрашиваем интерфейс и получаем указатель на наш класс. Теперь можно и методы вызывать.
pStep->MyComMessage(); pStep->Release(); cout << "Shuting down COM" << endl; CoUninitialize();
Вот можно запускать. Функция должна вызваться. У меня работает. Если не получается смотрите проект.
Проще я уже не смогу наверно придумать :-))). Но в этих шагах самые базовые понятие о COM основе OLE, DCOM, ActiveX есть всякие классы и, например, ATL облегчающие работу. Но понимать, что происходит за всем этим тоже интересно. Правда ???