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