Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Компонент COM на C++ не работает в VB 
:(
    Опции темы
SlimSlot
Дата 2.5.2010, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 )
Присоединённый файл  Simp.zip 11,56 Kb
PM MAIL   Вверх
EEEEEE
Дата 3.5.2010, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если честно, он - компонент и не может работать. Потому, что прописан только для клиентов на С++.
Необходимо сделать дуальный интерфейс с добавлением наследования от IDispatch. 
PM MAIL   Вверх
SlimSlot
Дата 3.5.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А зачем?
CreateObject вызывает CoCreateInstance, а следовательно COM-библиотека должна запускать DllGetClassObject для создания ClassFactory, после чего у IClassFactory вызывается CreateInstance, которая создает сам компонент и передает по цепочке указатель на нужный интерфейс

Не так?


Это сообщение отредактировал(а) SlimSlot - 3.5.2010, 12:25
PM MAIL   Вверх
xvr
Дата 4.5.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(SlimSlot @ 3.5.2010,  12:24)
А зачем?

Надо  smile 
Цитата

CreateObject вызывает CoCreateInstance, 
Угу, и просит интерфейс IDispatch
Цитата

а следовательно COM-библиотека должна запускать DllGetClassObject для создания ClassFactory, после чего у IClassFactory вызывается CreateInstance, которая создает сам компонент и передает по цепочке указатель на нужный интерфейс
'Нужный интерфейс' у вас не поддерживается
Цитата

Не так?
Вот так  smile 
CreateObject создает объект, с которым потом вся работа производится через IDispatch::invoke, т.к. интерпретатор не может работать с compile-time интерфейсами - он о них ничего не знает. А с run-time (IDispatch) может, т.к. ему о них ничего знать не нужно

PM MAIL   Вверх
SlimSlot
Дата 4.5.2010, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Эхх.....
А вот нифига и не надо ему IDispatch. И запрашивает не IDispatch изначально, а IUnknown. 
А уж потом, где-то там запрашивается нужный мне интерфейс. А как? Откуда?

А знает что запрашивать у компонента он из tlb-ки. Там то и описан  и указан [default] интерфейс компонента.

Так что для работы с компонентом в VB и, к примеру, Delphi (хотя не ручаюсь) вполне хватит реализации компонента + реализации фабрики классов + описания в двоичном формате всего компонента и интерфейса (например тот же tlb)

А вот под VBA компонент работать не будет. Он ведь OLE Automat., ему нужен IDispatch.
PM MAIL   Вверх
xvr
Дата 4.5.2010, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(SlimSlot @  4.5.2010,  20:12 Найти цитируемый пост)
А уж потом, где-то там запрашивается нужный мне интерфейс. А как? Откуда?
Из полученного IUnknown через QueryInterface
Цитата

Так что для работы с компонентом в VB
VB умеет работать и через IDispatch и напрямую. В данном случае напрямую он работать не будет, т.к. для этого нужна TypeLib, а она в reg файле не прописанна. (Если конечно в нем написанно то, что реально делается)
Цитата

к примеру, Delphi
Для него не хватит, он работает через IDispatch
Цитата

А вот под VBA компонент работать не будет.
Угу. Я именно его и имел в виду в первом посте. Просто не ожидал, что кто то еще сейчас использует VB  smile

Добавлено через 2 минуты и 6 секунд
Кстати, как выглядит код в VB?

PM MAIL   Вверх
SlimSlot
Дата 4.5.2010, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Из полученного IUnknown через QueryInterface

Верно, через него.
Цитата

VB умеет работать и через IDispatch и напрямую. В данном случае напрямую он работать не будет, т.к. для этого нужна TypeLib, а она в reg файле не прописанна. (Если конечно в нем написанно то, что реально делается)

Вот. Собственно в этом и была проблема. Библиотека типов не была зарегистрирована в системе. Не прописана регистрация. После того, как я прописал в системе библиотеку типов, все заработало.
Но, собственно, имеется мнение, что VB таки должен сам регистрировать tlb из переданного файла. Почему он так не поступил - вопрос.

Цитата

Для него не хватит, он работает через IDispatch

Вот чего не знаю того не знаю. Но если так, то плохо, я был лучшего мнения о Delphi

Цитата

Угу. Я именно его и имел в виду в первом посте. Просто не ожидал, что кто то еще сейчас использует VB  smile

Я пишу, когда нужно что-то быстро написать. А почему нет то? VBA как раз использую куда реже.


Вообще, конечно, спасибо за обсуждение. Есть желание пообщаться вне форума. ы?
PM MAIL   Вверх
xvr
Дата 6.5.2010, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(SlimSlot @  4.5.2010,  22:29 Найти цитируемый пост)
Но, собственно, имеется мнение, что VB таки должен сам регистрировать tlb из переданного файла.
Ему никакой файл не дают - он берет инфу о COM объектах из реестра (через COM инфраструктуру). Компонент должен регистрировать себя сам. Если tlb не зарегистрировали, то этой инфы и нет  smile 
Цитата

Я пишу, когда нужно что-то быстро написать.
Не очень распространенный (сейчас) выбор. Я бы лично написал бы макрос в Excel'е, или взял Borland C++ Builder.
Цитата

VBA как раз использую куда реже.
В основном используется в качестве макросов в Оффисных поделках (сам по себе как то тоже не используется, я бы скорее взял JS или вообще perl)

Вот буквально пару дней назад сделал гибрид (как раз нужно было нечто по быстрому собрать) из Excel'а с VBA внутри + ActiveX для расчетов на VS

PM MAIL   Вверх
SlimSlot
Дата 6.5.2010, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Ему никакой файл не дают - он берет инфу о COM объектах из реестра (через COM инфраструктуру). Компонент должен регистрировать себя сам. Если tlb не зарегистрировали, то этой инфы и нет  smile 

Регистрация tlb и регистрация COM-компонента - это разные вещи. VB узнает какой интерфейс запрашивать только из tlb. Но о самом компоненте VB знает и без tlb. Но я считал что при подключении tlb уже сам VB должен регистрировать саму tlb. 

Цитата

Не очень распространенный (сейчас) выбор. Я бы лично написал бы макрос в Excel'е, или взял Borland C++ Builder.

Excel еще приму, но с диалогами там напряги. А до Borland C++ все никак руки не дойдут посмотреть. Может и стоит освоить.
PM MAIL   Вверх
xvr
Дата 7.5.2010, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(SlimSlot @  6.5.2010,  22:46 Найти цитируемый пост)
Регистрация tlb и регистрация COM-компонента - это разные вещи. 
Угу, но делает обе эти вещи сам COM компонент
Цитата

Но я считал что при подключении tlb уже сам VB должен регистрировать саму tlb.
Я не в курсе как подключается tlb в VB. Но структура COM системы такова, что tlb может сам подключаться автоматически при одном упоминании класса COM объекта.


PM MAIL   Вверх
SlimSlot
Дата 10.5.2010, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Я не в курсе как подключается tlb в VB. Но структура COM системы такова, что tlb может сам подключаться автоматически при одном упоминании класса COM объекта.

Нет не так. VB может создавать COM-компонент и без tlb вовсе. Правда ничего не известно будет о типах и наименованиях функций. 
PM MAIL   Вверх
xvr
Дата 10.5.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(SlimSlot @  10.5.2010,  20:07 Найти цитируемый пост)
VB может создавать COM-компонент и без tlb вовсе. 
Может, но в этом случае будет использоваться чистый IDispatch. Т.е. 'чистый' COM компонент (не dispinterface и не dual) работать не будет.


PM MAIL   Вверх
jonie
Дата 19.5.2010, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



xvr, насколько я знаю VB6 всегда работают через IDispatch, независимо от того "знает" компилятор или нет о методах (там вообще два режима компиляции - pcode и native, так вот pcode сдается мне работает точно через диспетчеризацию, насчет native не уверен).....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 19.5.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(jonie @  19.5.2010,  10:25 Найти цитируемый пост)
pcode сдается мне работает точно через диспетчеризацию
Да
Цитата

насчет native не уверен
А вот он МОЖЕТ работать через производный от IUnknown интерфейс напрямую. Но для этого ему нужет TypeLib

PM MAIL   Вверх
jonie
Дата 19.5.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата
Цитата

насчет native не уверен

А вот он МОЖЕТ работать через производный от IUnknown интерфейс напрямую. Но для этого ему нужет TypeLib

xvr, а ты уверен что он это делает? Можно, конечно, проверить.... но я где-то читал что vb поступает единообразно - тупо работает всегда через IDispatch.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




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


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

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