Шаг 31 - Создаем клиента

Итак, наша задача создать клиента, который сможет использовать наш COM объект. Создаем приложение как Win Console Application и давайте дадим ему имя MyComClient. Вы удивлены ??? А зря. Это вполне нормальное приложение, только без графического интерфейса. Но это не важно сейчас, зато всё остальное работает. Создавайте, как пустой проект. Добавьте файл MyComClient.cpp.

Первое, что мы должны сделать это инициализировать COM. Вот так:

#include "windows.h"
#include "iostream.h"

void main()
{
	cout  <<  "Initializing  COM"  <<  endl;
	if  (  FAILED(  CoInitialize(  NULL  ))) 
	{
		cout << "Unable to initialize COM" << endl;
		return ;
	}
}

Функция инициализации выглядит так.

HRESULT CoInitialize
( 
	LPVOID pvReserved  // Зарезервировано, должно быть нулем
);

Эта функция обладает рядом ограничений. Во-первых она не позволяет использовать все возможности OLE, а обеспечивает только COM. Ведь Вы помните, что COM это не OLE. COM - это фундамент, на котором строится OLE. Эту функцию можно воспринимать как инициализацию механизмов работы с COM для вашего приложения.

Теперь основываясь на имени компоненты нужно получить её CLSID. В имени указана и версия. Сделать это можно так.

CLSID clsid;
HRESULT hr = ::CLSIDFromProgID( L"My.Component.1", &clsid );

if ( FAILED( hr ))
{
	cout << "Unable to get CLSID " << endl;
	return ;
}

Что это за функция ??? Вот она.

HRESULT CLSIDFromProgID
(  
	LPCOLESTR lpszProgID,  // имя компонента
	LPCLSID pclsid         // сюда вернется уникальный идентификатор
);

Настало время соединиться с объектом. Делается это вот так.

IClassFactory* pCF;
hr = CoGetClassObject( clsid, CLSCTX_INPROC, NULL,IID_IClassFactory, (void**) &pCF );
if ( FAILED( hr ))
{
	cout << "Failed to GetClassObject "   << endl;
	return ;
}

Применяемая нами функция CoGetClassObject производит соединение с заданным объектом. Мы с помощью этой функции получаем доступ к интерфейсу фабрики класса IID_IClassFactory, которая сможет создать объект сама. Мы первым параметром указали идентификатор CLSID эта функция найдет по нему DLL используя запись в реестре InprocServer32.

Скомпилируйте и запустите. До данного момента должно выполняться всё без ошибок. Это будет говорить о том, что соединение с нашим сервером в принципе возмножно.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.