![]() |
|
|
![]()
|
|
| nvrrus |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 25.2.2011 Репутация: нет Всего: нет |
Здравствуйте, уважаемые форумчане! Помогите, пожалуйста разобраться с одной проблемой
Проблема использования билдеровской библиотеки в Qt В обоих случаях работаю с функциями библиотеки собранной в Builder. Получаю интерфейс I_archSource. Вызываю последовательно три метода, GetListOfQueries, size, Get. Каждый при отработке выводит сообщение с названием метода. Builder:
Все четко отрабатывает. В итоге три сообщения - GetListOfQueries, size, Get Qt:
Валится на последней строчке I_archQuery* Q = Queries->Get(0); При этом если пройти size() и встать на последнюю строчку получаю два сообщения: GetListOfQueries, Get (вместо GetListOfQueries, size) Заранее спасибо! Буду очень признателен, если что-то подскажете. |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
покажи интерфейс I_archSource. Лучше ВЕСЬ h-ник.
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| nvrrus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 25.2.2011 Репутация: нет Всего: нет |
Нашли ошибку. Кажется она в Билдере.
Это интерфейс нашей библиотеки собранной в билдере: Код:
Билдер не заносит виртуальный деструктор в таблицу виртуальных функций. А Qt заносит (что правильно). Поэтому происходит сдвиг при вызове. Вместо clear() вызывается push_back, вместо push_back, size(). И т.д. Убрали виртуальный деструктор, все заработало... Но так же нельзя, без виртуального деструктора... Подскажите, пожалуйста, может кто сталкивался с этой проблемой. |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
Qt - это набор классов. Какой у тебя компилятор ? (будем считать, что MSVC). Тогда, возможно, проблема не в этом. Builder и студия по-разному выравнивают указатель на виртуальную таблицу, если в опциях проекта указано выравнивание на 8 (на 4 - одинакого). Здесь ещё пару моментов, от которых можно ожидать подвоха: 1. Интерфейс нужно в явном виде (не полагаясь на настройки проекта) выровнять на 4 2. Нужно явно задать тип вызова функций 3. В явном виде добавить виртуальный деструктор
у меня в таком вот виде работают десятки dll-ек, написанные как в bcb, так и в студии, и используемые и там и там. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Виртуальные деструкторы COM объектов не попадают в их Интерфейсы. Ваш I_QuerriesList не является валидным COM интерфейсом (хотя и является валидным С++ классом)
Интерфейсы должны выглядеть так:
Унаследуйте ваш I_QuerriesList от IQuerriesList (и не забудьте преобразовать тип к IQuerriesList* когда будете его возвращать) |
||||
|
|||||
| nvrrus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 25.2.2011 Репутация: нет Всего: нет |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
__stdcall или __cdecl (в коде, который я привёл - __stdcall)
Зачем это нужно ? Представь, что в настройках проекта в билдере установлен тип вызова __stdcall, а в студии - __cdecl. Если в коде явно не указан тип вызова, то студия будет вызывать ф-цию, например, clear() по сишному, а билдер будет отрабатывать вызов по паскалевски. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| nvrrus |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 25.2.2011 Репутация: нет Всего: нет |
Сделал все как посоветовали. И теперь вообще ничего не понимаю.
Для тестирования создал интерфейс (без родителей) с одним методом Get5(). Реализовал его и еще 4 метода. Каждый пишет на экран соответствующую цифру - 1, 2, 3, 4, 5. Builder библиотека:
Qt использование:
Если оставить в реализации только одну функцию Get5(), валится с "Segmentation fault" В чем проблема? Подскажите, пожалуйста. |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
Хммм. Странно. Должно работать.
1. У деструктора не может быть никакого типа вызова (билдер это ещё кушает, а студия не должна). Но это не имеет отношения к делу. Так, ремарка 2. Покажи ф-цию Acreate_instance, а лучше весь тестовый проект Ты так и не сказал, какой у тебя компилятор. Qt - не компилятор, а набор h-ников, lib-ин и dll Это сообщение отредактировал(а) borisbn - 4.4.2011, 20:49 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| nvrrus |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 25.2.2011 Репутация: нет Всего: нет |
Компилятор mingw.
Вот функция CreateInstance, библиотеки Builder:
Так я ее выгружаю из библиотеки в Qt:
|
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Кстати, деструкторы между mingw/Builder могут не работать. У разных компиляторов могут быть разные взгляды на способы реализации конструкторов и деструкторов
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
действительно, странно.
сделал всё как у тебя, за исключением того, что у меня нет minGW, поэтому сделал в студии. У меня "выплёвывается" 5. см. аттач Присоединённый файл ( Кол-во скачиваний: 6 )
bcb_dll.zip 33,89 Kb-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| nvrrus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 25.2.2011 Репутация: нет Всего: нет |
Спасибо, огромное, за участие.
Я тоже сделал пустой проект в Qt. Беру интерфейс из вашей библиотеки. Get5() пишет "1".
Возможно в этом проблема. Можно ли что-то докрутить, чтобы деструкторы Builder нормально виделись mingw? |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
можно. Выкинуть деструктор. Добавить виртуальную ф-цию destroy, в реализации которой вызывать
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| nvrrus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 25.2.2011 Репутация: нет Всего: нет |
Да, спасибо, это действительно было бы выходом.
Но при отсутствии деструктора, все равно возникает та же проблема. |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |