Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск DLL в суррогатном процессе, не клеится что-то... 
V
    Опции темы
me21
Дата 10.10.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 13.1.2006

Репутация: нет
Всего: нет



Здравствуйте.

Начал учить COM, по книге (Э.Трельсен "Модель СОМ и применение ATL 3.0") написал и зарегистрировал внутрипроцессный СОМ-сервер (DLL), работает... А вот загрузить его в суррогатный процесс dllhost.exe не получается   smile 

Изменения проделал такие: в реестре для своего HKCR\CLSID указал параметр AppID с таким же значением, плюс создал в HKCR\AppID соответствующий ключ, а у него пустой параметр DllSurrogate. Ну и в исходнике CLSCTX_INPROC_SERVER заменил на CLSCTX_LOCAL_SERVER.

При запуске запрос интерфейса IClassFactory проходит нормально, запускается dllhost.exe, подгружает мою dll, а вот дальше, когда я получил интерфейс фабрики, вызов CreateInstance оканчивается ошибкой (код возврата E_FAIL).

Если запускать СОМ-сервер внутри процесса (CLSCTX_INPROC_SERVER), то всё отрабатывает нормально.

Может, было у кого-то похожее?

 smile  smile 

Код

    IClassFactory* pCF;
    // если CLSCTX_INPROC_SERVER, то все ОК
    HRESULT hr = CoGetClassObject(CLSID_CoCar, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory, (void**)&pCF);

    ICreateCar* pICC;
    IEngine* pIEngine;
    IStats* pIStats;

    // следующая строка не срабатывает (ICreateCar - один из интерфейсов моего кокласса)
    hr = pCF->CreateInstance(NULL, IID_ICreateCar, (void**)&pICC);
    pCF->Release();


Это сообщение отредактировал(а) me21 - 10.10.2006, 00:21
PM MAIL   Вверх
me21
Дата 10.10.2006, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 13.1.2006

Репутация: нет
Всего: нет



Обнаружил в OleViewer вот что. Если запускать как внутрипроцессный сервер, то набор интерфейсов получается мой (ICreateCar, IEngine, IStats). А если как локальный, то интерфейсы у моего объекта будут следующие: IClientSecurity, IMarshal, IMultiQI, IProxyManager. Вот и не получается запросить ICreateCar. Но почему так? smile 
PM MAIL   Вверх
me21
Дата 10.10.2006, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 13.1.2006

Репутация: нет
Всего: нет



Проблему решил. Как я действовал:

1) Прочитал следующую главу про маршалинг. Особенно заинтересовал пункт "Конфигурирование интерфейса под использование стандартного маршалинга". Я решил, что раз уж моя DLL будет размещаться в другом процессе, хоть и суррогатном, то маршалинг будет иметь место. Выяснил, что каждый интерфейс надо снабдить атрибутом [oleautomation], а также занести информацию об интерфейсах в HKCR\Interface. Там под ключами, соответствующими их IID, завести параметр ProxyStubClsid32 со значением {00020421-0000-0000-C000-000000000046}. Так и сделал. Ни фига не заработало.

2) Собственно после этого я и полез на форумы в инете.

3) Подождав полчаса и выяснив, что по ночам на форумах мало кто сидит, я полез в Гугл. Там на второй-третьей ссылке нашел "Десять мифов о СОМ" (http://www.microsoft.com/msj/1197/activex1197.aspx), где в третьем мифе с удивлением увидел следующее:

Код

Note that the interface's ProxyStubClsid32 entry refers to the CLSID {00020424-0000-0000-C000-000000000046}. 
This is the CLSID of the universal marshaler.


У меня была ошибка в одной цифре ГУИДа, блин. Точнее, в книге опечатка. После внесения поправок в реестр все заработало.
Хотя не совсем понимаю, почему не работало раньше, ведь InProcServer32 = oleaut32.dll как у 00020424... так и у 00020421...

Комментарии гуру к моим логическим размышлениям приветствуются   smile 
Остался один вопрос - почему в книге о конфигурировании интерфейсов говорится в следующей главе, а не тогда, когда описывается работа DLL в суррогатном процессе? Там бодро говорится, что достаточно создать раздел AppID и пустой параметр DllSurrogate. Может, я все-таки что-то упустил и нашел обходной путь вместо прямого?

Это сообщение отредактировал(а) me21 - 10.10.2006, 01:59
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.