![]() |
|
|
![]()
|
|
| obiwan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 25.7.2007 Где: Ukraine Репутация: нет Всего: нет |
Доброго времени суток.
Столкнулся со следующей проблемой: создал ATL/EXE сервер, в нем создал класс, для него сделал 2 интерфейса, реализовал их. В клиенте постоянно получаю из CoCreateInstance E_NOINTERFACE. В реестре все зарегистрировалось, не могу понять в чем проблема. Сильно не ругайте, так как это первый проект написанный мной на ATL. Заранее спасибо за ответы. |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
obiwan, возьмите в руки во первых oleview (идёт со студией), откройте в нем TypeLibrary (красненькие треугольнички), посмотрите на ваш EXE файл, там все ваши интерфейсы описаны? (мож не тот файл регистрируете, малоли)
Далее ищите в коде карту (BEGIN_COM_MAP) и покажите её нам .. ну и объявление кокласса не забудьте показать -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| obiwan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 25.7.2007 Где: Ukraine Репутация: нет Всего: нет |
В EXE и TLB через OLEVIEW все интерфейсы видно.
Вот объявления кокласса:
|
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
obiwan, IDL описание части coclass дайте. Там должно быть нечто вроде:
Это сообщение отредактировал(а) jonie - 15.10.2009, 00:24 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| obiwan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 25.7.2007 Где: Ukraine Репутация: нет Всего: нет |
|
|||
|
||||
| obiwan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 25.7.2007 Где: Ukraine Репутация: нет Всего: нет |
Разобрался. По тупости забыл зарегать Proxy/Stub dll. Спасибо jonie.
|
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
obiwan, можно и не регить, если юзаете на одной машине... MyDll.Exe /RegServer
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Если сервер в exe, то proxy dll все равно нужно регистрировать (если конечно ее сам .exe не зарегистрирует |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
xvr, а мне кажется ты ошибаешься.
в аттаче пример, усе работает как часы и без всяких DLL. Присоединённый файл ( Кол-во скачиваний: 4 )
ATLTest.7z.doc 11,96 Kb-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Не ошибаюсь - поменял в примере тип класса на
Производные от IDispatch действительно не требуют proxy для работы, видимо COM система и так знает, что с ними делать |
||||
|
|||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
xvr, объяснить увиденное можешь научно ? Честно говоря никогда не делал не дуальных exe серверов....
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Объяснить не могу, могу только предполагать. Во первых, для работы exe сервера в общем случае stub dll необходима, т.к. клиент и сервер находятся в разных процессах и для вызова через границу процесса нужно выполнять маршалинг параметров и самого объекта. Собственно этим stub и занимается. Но есть 2 НО: 1. Если доступен typelib для объекта, то COM подсиситема в принципе может эти stub'ы построить сама (midl же собственно это и делает) 2. Если объект является IDispatch или dual интерфейсом, то вполне можно отмаршалить только IDispatch часть (она стандартная). Хотя с клиентской частью все равно будут проблемы :( К ней могут обратится не через IDispatch часть. Скорее всего используется комбинация этих подходов - через IDispatch извлекают typelib и по ней динамически строят stub & proxy |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |