![]() |
|
![]() ![]() ![]() |
|
me21 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 13.1.2006 Репутация: нет Всего: нет |
Здравствуйте.
Начал учить COM, по книге (Э.Трельсен "Модель СОМ и применение ATL 3.0") написал и зарегистрировал внутрипроцессный СОМ-сервер (DLL), работает... А вот загрузить его в суррогатный процесс dllhost.exe не получается ![]() Изменения проделал такие: в реестре для своего HKCR\CLSID указал параметр AppID с таким же значением, плюс создал в HKCR\AppID соответствующий ключ, а у него пустой параметр DllSurrogate. Ну и в исходнике CLSCTX_INPROC_SERVER заменил на CLSCTX_LOCAL_SERVER. При запуске запрос интерфейса IClassFactory проходит нормально, запускается dllhost.exe, подгружает мою dll, а вот дальше, когда я получил интерфейс фабрики, вызов CreateInstance оканчивается ошибкой (код возврата E_FAIL). Если запускать СОМ-сервер внутри процесса (CLSCTX_INPROC_SERVER), то всё отрабатывает нормально. Может, было у кого-то похожее? ![]() ![]()
Это сообщение отредактировал(а) me21 - 10.10.2006, 00:21 |
|||
|
||||
me21 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 13.1.2006 Репутация: нет Всего: нет |
Обнаружил в OleViewer вот что. Если запускать как внутрипроцессный сервер, то набор интерфейсов получается мой (ICreateCar, IEngine, IStats). А если как локальный, то интерфейсы у моего объекта будут следующие: IClientSecurity, IMarshal, IMultiQI, IProxyManager. Вот и не получается запросить ICreateCar. Но почему так?
![]() |
|||
|
||||
me21 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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), где в третьем мифе с удивлением увидел следующее:
У меня была ошибка в одной цифре ГУИДа, блин. Точнее, в книге опечатка. После внесения поправок в реестр все заработало. Хотя не совсем понимаю, почему не работало раньше, ведь InProcServer32 = oleaut32.dll как у 00020424... так и у 00020421... Комментарии гуру к моим логическим размышлениям приветствуются ![]() Остался один вопрос - почему в книге о конфигурировании интерфейсов говорится в следующей главе, а не тогда, когда описывается работа DLL в суррогатном процессе? Там бодро говорится, что достаточно создать раздел AppID и пустой параметр DllSurrogate. Может, я все-таки что-то упустил и нашел обходной путь вместо прямого? Это сообщение отредактировал(а) me21 - 10.10.2006, 01:59 |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |