![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
borisbn |
|
||||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Здравствуйте.
Столкнулся с такой проблемой: есть dll-ка, созданная на MSVC 2008. В ней используется (как его обозвал xvr, кажется) недо-COM. Сейчас поясню. Описан виртуальный абстрактный интерфейс, сделан наследник от него и функция создания объекта iface.h
iface_impl.h
ну и ф-ция создания объекта:
теперь в проекте на MinGW делаю следующее
И вот тут начинаются чудеса. Вот вывод приложения
а дальше приложение "падает". оно и понятно - вместо init() вызывается reset(), а вместо reset() - destroy()... дальше понятно, почему падает.. Немного поковырялся и нашёл, как вывести class layout в студии и в MinGW. Вот студийный class layout
вот MinGW-шный
Теперь, собственно, вопрос: откуда у MinGW взялся второй деструктор и что это за IFace::__vecDelDtor у студии ? А, да... Самое главное: как, всё-таки их (студию и MinGW) подружить ? Спасибо. Это сообщение отредактировал(а) borisbn - 11.4.2012, 13:05 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||||||||
|
|||||||||||||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
подобную штуку я писал. но проверял как: gcc(.dll)-gcc(loader), mingw(.dll)-mingw(loader). все работает.
Добавлено через 32 секунды попробуй убери. |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
ну... среди "своих", понятно дело, разлада нету ![]() проблема-то именно msvc(.dll)-mingw(loader)... я так понимаю, что и наоборот тоже будет проблема пробовал. так же пробовал от pack( 1 ) до pack( 8 ). Результат тот же. Ты обратил внимание, что MinGW генерит 2 деструктора ? Откуда ? ![]() Кстати, можешь сам попробовать - скомпилять этот h-ник с опцией -fdump-class-hierarchy Будет создан файл имя_cpp_шника.class, из которого я и выдернул Dump из первого сообщения -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
да. хз откуда. венды под рукой нет, а gcc вообще не понимает что такое __stdcall ![]() хотя, помоему, должен... Добавлено через 6 минут и 17 секунд http://liveworkspace.org/code/c08712cda514...6ffd45d6b63fb95 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
MinGW понимает. И правильно понимает. Хмммм.... Если верить студийному дампу
то у студийного интерфейса тоже 2 деструктора: обычный IFace::__delDtor и какой-то "векторный" что-ли - IFace::__vecDelDtor может у gcc/mingw 2-й деструктор тоже "векторный", но располагается в виртуальной таблице сразу за обычным, а в студии в конце, например ? Пойду погуглю про vecDelDtor -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
а обязательно из DLL возвращать IFace ???? может сделать проще, IFace пускай будет внутри DLL а из нее только экспортировать обычные функции работающие с IFace
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Dem_max, да оно-то можно... но хотелось бы более ... высокоуровнево что-ли работать.
И ещё: сейчас я подгружаю dll-ку динамически (QLibrary::resolve). При большом количестве функций в интерфейсе это будет напрягать. Сейчас при изменении интерфейса мне достаточно перекомпилировать оба проекта и всё. А так - ещё не забыть добавить соответствующую функцию в таблицу экспорта... Неохота... А главное - обидно - у меня такая связка работает на куче проектов на Builder'е, студийном и интеловском компиляторах... P.S. Подгружать dll-ку статически (через библиотеку импорта) не могу, т.к. по логике работы при отсутствии dll-ки у меня работает один код, а при наличие - код из неё. Да и просто интересно уже разобраться как подружить детей Била Гейтса и boostcoder'а ![]() ![]() ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
он ведь так и сделал:
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
boostcoder, не... насколько я понял, Dem_max имел в виду что-то типа такого
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
borisbn, так этого не нужно. то что ты сделал должно работать.
|
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
однако, при таком вызове вызывается так
и очень похоже, что из-за второго деструктора. очень похоже на правду... вот здесь - http://www.developerfusion.com/article/843...th-the-dia-sdk/ - в разделе "Running the utility" есть такой код с примечательными комментариями
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
sergioK1 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Да никак, хотя может дэ фукс и получиться чего Не пользуй под винду не родное и спи спокойно ![]() И доку читай Мелкософта , там это написано , |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
sergioK1, если хочешь потроллить - ошибся адресом. Я не кормлю троллей.
Если хочешь помочь в проблеме - расскажи, что ты вычитал в "доке у Майкрософта". А ещё лучше дай ссылку, а то твои выражения непросто понять. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
borisbn, COM интерфейс ничего не знает о деструкторах. Деструкторы это непереносимая фишка С++. Виртуальный деструктор может быть в классе, но его не должно быть в COM интерфейсе. Поскольку ты использовал непереносимую конструкцию вот и поимел проблемы.
Для уничтожения объекта можешь написать простые виртуальные функции. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
sergioK1 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Попробуй в "обычном" эклипсе (http://www.eclipse.org/downloads/) в худшем случае полчаса потеряешь, просто попробуй, 2 строку выбери, Я не понимаю "что-такое mingw" доке у Майкрософта явно "про детей" ничего не сказано, неявно между строк да, плюс у меня чутье с опытом наработанное, нюх что ли как у собаки ![]() не пользуй - будут проблемы, KISS. Если под VC работает то что еще надо-то?, твой product manager этого не понимает ?, для кастомера какая разница ? или Я чего не понимаю . |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |