DCOM - передача интерфейсов м/у клиентом и сервером

Модераторы: Romeo, Hawk, Absurd, WinMain, DeeJayC

Ответить
Владимир
Сообщения: 56
Зарегистрирован: 25 апр 2005, 12:57

DCOM - передача интерфейсов м/у клиентом и сервером

Сообщение Владимир » 09 июн 2005, 19:03

Привет всем. Помогите решить проблему, суть которой в следующем: есть клиент(dll) и сервер(exe), который запускается на удаленной машине. В клиенте при активации сервера CoCreateInstanceEx(CLSID_COMdev,NULL,CLSCTX_REMOTE_SERVER,&csi,1,qi) я получаю нужный интерфейс
m_iCOMdev = (ICOMdev*)qi[0].pItf, а затем вызываю метод сервера, через параметры которого хочу передать ссылку на интерфейс клиента m_iCOMdev->OpenConnection(GetUnknown()).
Когда на сервере пытаюсь получить конкретный интерфейс клиента

STDMETHODIMP CCOMdev::OpenConnection(IUnknown *pLink)
......
IPropertyLink *piLink = NULL;
hr = pLink->QueryInterface(IID_IPropertyLink,(void**)&piLink);
.......
метод возвращает E_FAIL.
Для пересылки интерфейсов использую универсальный маршалинг.
Что делать?

Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Сообщение Eugie » 10 июн 2005, 00:16

А что возвращает GetUnknown()?

Владимир
Сообщения: 56
Зарегистрирован: 25 апр 2005, 12:57

Сообщение Владимир » 10 июн 2005, 11:51

GetUnknown() возвращает cссылку на базовый интерфейс IUnknown* текущего объекта клиента

Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Сообщение Eugie » 12 июн 2005, 16:39

На первый взгляд возможные причины: 1) клиент не реализует интерфейс IID_IPropertyLink; 2) IID_IPropertyLink не зарегистрирован на сервере.

Владимир
Сообщения: 56
Зарегистрирован: 25 апр 2005, 12:57

Сообщение Владимир » 14 июн 2005, 13:11

Спасибо за помощь. Вроде как разобрался в чем причина: нужно было объявить IPropertyLink в операторе библиотеки сервера (клиент должен видеть этот интерфейс, чтобы создать объект-приемник - "механизм двустороннего обмена информацией с помощью косвенно-вызываемого интерфейса")

library SERVERLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");

interface IPropertyLink;
...

Ответить