Вернуться к статье

Листинг 1. Файл Car.rgs.

HKCR
{
	DCOM_Server.Car.1 = s `Car Class`
	{
		CLSID = s `{0A08D45F-07CD-11D5-8720
						-00500433EEC4}`
	}
	DCOM_Server.Car = s `Car Class`
	{
		CLSID = s `{0A08D45F-07CD-11D5-8720
						-00500433EEC4}`
		CurVer = s `DCOM_Server.Car.1`
	}
	NoRemove CLSID
	{
		ForceRemove {0A08D45F-07CD-11D5-8720
						-00500433EEC4} = s `Car Class`
		{
			val AppID = s `{0A08D45F-07CD-11D5-8720
						-00500433EEC4}`
			ProgID = s `DCOM_Server.Car.1`
			VersionIndependentProgID = s `DCOM_Server.Car`
			InprocServer32 = s `%MODULE%`
			{
				val ThreadingModel = s `Apartment`
			}
			`TypeLib` = s `{0A08D452-07CD-11D5-8720
						-00500433EEC4}`
		}
	}
	NoRemove AppID
	{
		ForceRemove {0A08D45F-07CD-11D5-8720
						-00500433EEC4} = s `Car Class`
		{
			{
				val dllSurrogate = s ` `
}
		}
	}
}


Вернуться к статье

Листинг 2. Реализация методов интерфейса (файл Car.cpp).

STDMETHODIMP CCar::AddFuel(long nFuelVolume)
{
	// Добавить топливо 
	if (nFuelVolume > 0)
	{
		m_nFuelVolume += nFuelVolume;
		return S_OK;
	}
	else
	{
		return E_INVALIDARG; // Сливать топливо нельзя!
	}
}
STDMETHODIMP CCar::GetHaul(long *pnHaul)
{
	// Вычислить пробег на имеющемся топливе
	// Предполагаемый расход топлива 10 л на 100 км пути
	// т. е. 1 л на 10 км
	*pnHaul = m_nFuelVolume * 10;
	return S_OK;
}


Вернуться к статье

Листинг 3. Код активизации сервера и вызовы методов.

// Инициализировать библиотеку COM
	HRESULT hr = CoInitialize(NULL);
	if (FAILED(hr))
	{
		// Не удалось инициализировать библиотеку COM
		_com_error err(hr);
		const char * pszErrorDescr = err.ErrorMessage();
		printf(«%s
», pszErrorDescr);
		return;
	}
char* pszIP = «206.168.10.29»; // здесь должен быть адрес или имя удаленного //компьютера, на котором находится сервер
	USES_CONVERSION; // макрос для конвертации строк. Описан в файле atlbase.h
	COSERVERINFO si; // структура с информацией об удаленном сервере
	memset(&si, 0, sizeof(si));
	si.pwszName = T2W(pszIP); // конвертируем char* в wchar* вот зачем нужен макрос
	MULTI_QI qi;
	qi.pItf = NULL;
	qi.hr = S_OK;
	qi.pIID = &__uuidof(ICar);
	try
	{
	 hr = CoCreateInstanceEx(CLSID_Car, NULL,
							CLSCTX_REMOTE_SERVER,
							&si, 1, &qi ); 
if(FAILED(hr))
		{
			_com_error ex(hr);
			throw ex;
		}
		ICarPtr spI; // смарт-указатель
		spI.Attach((ICar*)qi.pItf, 0);
				long lFuelVolume = 100;
		long lHaul = 0;
		// Вызываем методы интерфейса
spI->AddFuel(lFuelVolume);
		printf(«Fuel added. Volume = %d
», lFuelVolume);
		spI->GetHaul(&lHaul);
		printf(«Haul = %d
», lHaul);
		printf(«DCOM server works!
»);	
}
	catch(_com_error & ex)
	{
		// Обработка ошибок
const char * pszErrorDescr = ex.ErrorMessage();
		printf(«%s
», pszErrorDescr);
	}
// Освободить библиотеку COM
CoUninitialize();


Вернуться к статье

Поделитесь материалом с коллегами и друзьями