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

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

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

09 июн 2005, 20: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

10 июн 2005, 01:16

А что возвращает GetUnknown()?
Владимир
Сообщения: 56
Зарегистрирован: 25 апр 2005, 13:57

10 июн 2005, 12:51

GetUnknown() возвращает cссылку на базовый интерфейс IUnknown* текущего объекта клиента
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

12 июн 2005, 17:39

На первый взгляд возможные причины: 1) клиент не реализует интерфейс IID_IPropertyLink; 2) IID_IPropertyLink не зарегистрирован на сервере.
Владимир
Сообщения: 56
Зарегистрирован: 25 апр 2005, 13:57

14 июн 2005, 14:11

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

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

interface IPropertyLink;
...
Ответить