Шаг 32 - Дальше создаем клиента

Теперь нам нужно создать объект. Вот так.

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 облегчающие работу. Но понимать, что происходит за всем этим тоже интересно. Правда ???


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 14.04.2000