Вернуться к статье
Листинг 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();
Вернуться к статье