![]() |
|
![]() ![]() ![]() |
|
SlimSlot |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 27.7.2009 Репутация: нет Всего: нет |
Добрый день!
Написал достаточно черновой вариант одного COM-компонента. Сам компонент располагается в Dll. Из-под VC++ юзается нормально, пробую запустить на VB через CreateObject - вываливается IDE. Пробовал отладить Debug - версию библиотеки, падение происходит при вызове AddRef для созданного компонента с ошибкой Unhandled exception at 0x00000000 in VB6.EXE: 0xC0000005: Access violation reading location 0x00000000. Нарушение работы с памятью. Вызов AddRef осуществляется так: ((IUnknown*)(*ppv))->AddRef(); Теперь о самом компоненте. Компонент содержит фабрику классов, которая создает компонент, соответственно содержит DllGetClassObject Если кому-то нужно, могу дать все коды (просто их не так мало, поэтому что нужно то дам) Интересно просто, куда копать. Пробовал и через tlb линковать, все равно падает (да собственно какая разница) Во вложении Debug версия библиотеки, tlb-ка и reg.-файл регистрации. Попробуйте, может это у меня что не так. Присоединённый файл ( Кол-во скачиваний: 6 ) ![]() |
|||
|
||||
EEEEEE |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 15.5.2006 Репутация: нет Всего: нет |
Если честно, он - компонент и не может работать. Потому, что прописан только для клиентов на С++.
Необходимо сделать дуальный интерфейс с добавлением наследования от IDispatch. |
|||
|
||||
SlimSlot |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 27.7.2009 Репутация: нет Всего: нет |
А зачем?
CreateObject вызывает CoCreateInstance, а следовательно COM-библиотека должна запускать DllGetClassObject для создания ClassFactory, после чего у IClassFactory вызывается CreateInstance, которая создает сам компонент и передает по цепочке указатель на нужный интерфейс Не так? Это сообщение отредактировал(а) SlimSlot - 3.5.2010, 12:25 |
|||
|
||||
xvr |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Надо ![]()
![]() CreateObject создает объект, с которым потом вся работа производится через IDispatch::invoke, т.к. интерпретатор не может работать с compile-time интерфейсами - он о них ничего не знает. А с run-time (IDispatch) может, т.к. ему о них ничего знать не нужно |
||||||||
|
|||||||||
SlimSlot |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 27.7.2009 Репутация: нет Всего: нет |
Эхх.....
А вот нифига и не надо ему IDispatch. И запрашивает не IDispatch изначально, а IUnknown. А уж потом, где-то там запрашивается нужный мне интерфейс. А как? Откуда? А знает что запрашивать у компонента он из tlb-ки. Там то и описан и указан [default] интерфейс компонента. Так что для работы с компонентом в VB и, к примеру, Delphi (хотя не ручаюсь) вполне хватит реализации компонента + реализации фабрики классов + описания в двоичном формате всего компонента и интерфейса (например тот же tlb) А вот под VBA компонент работать не будет. Он ведь OLE Automat., ему нужен IDispatch. |
|||
|
||||
xvr |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
![]() Добавлено через 2 минуты и 6 секунд Кстати, как выглядит код в VB? |
||||||||
|
|||||||||
SlimSlot |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 27.7.2009 Репутация: нет Всего: нет |
Верно, через него.
Вот. Собственно в этом и была проблема. Библиотека типов не была зарегистрирована в системе. Не прописана регистрация. После того, как я прописал в системе библиотеку типов, все заработало. Но, собственно, имеется мнение, что VB таки должен сам регистрировать tlb из переданного файла. Почему он так не поступил - вопрос.
Вот чего не знаю того не знаю. Но если так, то плохо, я был лучшего мнения о Delphi
Я пишу, когда нужно что-то быстро написать. А почему нет то? VBA как раз использую куда реже. Вообще, конечно, спасибо за обсуждение. Есть желание пообщаться вне форума. ы? |
||||||||
|
|||||||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
![]()
Вот буквально пару дней назад сделал гибрид (как раз нужно было нечто по быстрому собрать) из Excel'а с VBA внутри + ActiveX для расчетов на VS |
||||||
|
|||||||
SlimSlot |
|
||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 27.7.2009 Репутация: нет Всего: нет |
Регистрация tlb и регистрация COM-компонента - это разные вещи. VB узнает какой интерфейс запрашивать только из tlb. Но о самом компоненте VB знает и без tlb. Но я считал что при подключении tlb уже сам VB должен регистрировать саму tlb.
Excel еще приму, но с диалогами там напряги. А до Borland C++ все никак руки не дойдут посмотреть. Может и стоит освоить. |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Угу, но делает обе эти вещи сам COM компонент
|
|||
|
||||
SlimSlot |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 27.7.2009 Репутация: нет Всего: нет |
Нет не так. VB может создавать COM-компонент и без tlb вовсе. Правда ничего не известно будет о типах и наименованиях функций. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
||||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
xvr, насколько я знаю VB6 всегда работают через IDispatch, независимо от того "знает" компилятор или нет о методах (там вообще два режима компиляции - pcode и native, так вот pcode сдается мне работает точно через диспетчеризацию, насчет native не уверен).....
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
||||
|
||||
jonie |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
xvr, а ты уверен что он это делает? Можно, конечно, проверить.... но я где-то читал что vb поступает единообразно - тупо работает всегда через IDispatch. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
![]() ![]() ![]() |
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. |