| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Компонент COM на C++ не работает в VB |
| Автор: SlimSlot 2.5.2010, 23:29 |
| Добрый день! Написал достаточно черновой вариант одного 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.-файл регистрации. Попробуйте, может это у меня что не так. |
| Автор: EEEEEE 3.5.2010, 07:45 |
| Если честно, он - компонент и не может работать. Потому, что прописан только для клиентов на С++. Необходимо сделать дуальный интерфейс с добавлением наследования от IDispatch. |
| Автор: SlimSlot 3.5.2010, 12:24 |
| А зачем? CreateObject вызывает CoCreateInstance, а следовательно COM-библиотека должна запускать DllGetClassObject для создания ClassFactory, после чего у IClassFactory вызывается CreateInstance, которая создает сам компонент и передает по цепочке указатель на нужный интерфейс Не так? |
| Автор: xvr 4.5.2010, 16:11 | ||||||||
Надо
CreateObject создает объект, с которым потом вся работа производится через IDispatch::invoke, т.к. интерпретатор не может работать с compile-time интерфейсами - он о них ничего не знает. А с run-time (IDispatch) может, т.к. ему о них ничего знать не нужно |
| Автор: SlimSlot 4.5.2010, 20:12 |
| Эхх..... А вот нифига и не надо ему IDispatch. И запрашивает не IDispatch изначально, а IUnknown. А уж потом, где-то там запрашивается нужный мне интерфейс. А как? Откуда? А знает что запрашивать у компонента он из tlb-ки. Там то и описан и указан [default] интерфейс компонента. Так что для работы с компонентом в VB и, к примеру, Delphi (хотя не ручаюсь) вполне хватит реализации компонента + реализации фабрики классов + описания в двоичном формате всего компонента и интерфейса (например тот же tlb) А вот под VBA компонент работать не будет. Он ведь OLE Automat., ему нужен IDispatch. |
| Автор: SlimSlot 4.5.2010, 22:29 | ||||||||
Верно, через него.
Вот. Собственно в этом и была проблема. Библиотека типов не была зарегистрирована в системе. Не прописана регистрация. После того, как я прописал в системе библиотеку типов, все заработало. Но, собственно, имеется мнение, что VB таки должен сам регистрировать tlb из переданного файла. Почему он так не поступил - вопрос.
Вот чего не знаю того не знаю. Но если так, то плохо, я был лучшего мнения о Delphi
Я пишу, когда нужно что-то быстро написать. А почему нет то? VBA как раз использую куда реже. Вообще, конечно, спасибо за обсуждение. Есть желание пообщаться вне форума. ы? |
| Автор: xvr 6.5.2010, 11:24 | ||||||
Вот буквально пару дней назад сделал гибрид (как раз нужно было нечто по быстрому собрать) из Excel'а с VBA внутри + ActiveX для расчетов на VS |
| Автор: SlimSlot 6.5.2010, 22:46 | ||||
Регистрация tlb и регистрация COM-компонента - это разные вещи. VB узнает какой интерфейс запрашивать только из tlb. Но о самом компоненте VB знает и без tlb. Но я считал что при подключении tlb уже сам VB должен регистрировать саму tlb.
Excel еще приму, но с диалогами там напряги. А до Borland C++ все никак руки не дойдут посмотреть. Может и стоит освоить. |
| Автор: xvr 7.5.2010, 08:08 | ||
Угу, но делает обе эти вещи сам COM компонент
|
| Автор: SlimSlot 10.5.2010, 20:07 | ||
Нет не так. VB может создавать COM-компонент и без tlb вовсе. Правда ничего не известно будет о типах и наименованиях функций. |
| Автор: xvr 10.5.2010, 21:03 |
| Может, но в этом случае будет использоваться чистый IDispatch. Т.е. 'чистый' COM компонент (не dispinterface и не dual) работать не будет. |
| Автор: jonie 19.5.2010, 10:25 |
| xvr, насколько я знаю VB6 всегда работают через IDispatch, независимо от того "знает" компилятор или нет о методах (там вообще два режима компиляции - pcode и native, так вот pcode сдается мне работает точно через диспетчеризацию, насчет native не уверен)..... |
| Автор: xvr 19.5.2010, 11:09 | ||
Да
|
| Автор: jonie 19.5.2010, 11:47 | ||||
xvr, а ты уверен что он это делает? Можно, конечно, проверить.... но я где-то читал что vb поступает единообразно - тупо работает всегда через IDispatch. |
| Автор: xvr 19.5.2010, 11:51 |
| Абсолютно точно (и именно за VB6) не поручусь, но начиная с некоторой версии VB он это точно делает (но опять же не поручусь делает он это всегда сам, или ему надо где нибудь в настройках компилятора что нибудь прописать или галочек поставить) |