| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Один код работет в Builder, но не работает в Qt |
| Автор: nvrrus 4.4.2011, 11:42 | ||||
| Здравствуйте, уважаемые форумчане! Помогите, пожалуйста разобраться с одной проблемой Проблема использования билдеровской библиотеки в Qt В обоих случаях работаю с функциями библиотеки собранной в Builder. Получаю интерфейс I_archSource. Вызываю последовательно три метода, GetListOfQueries, size, Get. Каждый при отработке выводит сообщение с названием метода. Builder:
Все четко отрабатывает. В итоге три сообщения - GetListOfQueries, size, Get Qt:
Валится на последней строчке I_archQuery* Q = Queries->Get(0); При этом если пройти size() и встать на последнюю строчку получаю два сообщения: GetListOfQueries, Get (вместо GetListOfQueries, size) Заранее спасибо! Буду очень признателен, если что-то подскажете. |
| Автор: borisbn 4.4.2011, 12:46 |
| покажи интерфейс I_archSource. Лучше ВЕСЬ h-ник. |
| Автор: nvrrus 4.4.2011, 12:55 | ||
| Нашли ошибку. Кажется она в Билдере. Это интерфейс нашей библиотеки собранной в билдере: Код:
Билдер не заносит виртуальный деструктор в таблицу виртуальных функций. А Qt заносит (что правильно). Поэтому происходит сдвиг при вызове. Вместо clear() вызывается push_back, вместо push_back, size(). И т.д. Убрали виртуальный деструктор, все заработало... Но так же нельзя, без виртуального деструктора... Подскажите, пожалуйста, может кто сталкивался с этой проблемой. |
| Автор: xvr 4.4.2011, 13:19 | ||||
| Виртуальные деструкторы COM объектов не попадают в их Интерфейсы. Ваш I_QuerriesList не является валидным COM интерфейсом (хотя и является валидным С++ классом) Интерфейсы должны выглядеть так:
Унаследуйте ваш I_QuerriesList от IQuerriesList (и не забудьте преобразовать тип к IQuerriesList* когда будете его возвращать) |
| Автор: nvrrus 4.4.2011, 14:21 | ||
Что значит явно задать тип вызова функций? |
| Автор: borisbn 4.4.2011, 14:26 |
| __stdcall или __cdecl (в коде, который я привёл - __stdcall) Зачем это нужно ? Представь, что в настройках проекта в билдере установлен тип вызова __stdcall, а в студии - __cdecl. Если в коде явно не указан тип вызова, то студия будет вызывать ф-цию, например, clear() по сишному, а билдер будет отрабатывать вызов по паскалевски. |
| Автор: nvrrus 4.4.2011, 17:49 | ||||
| Сделал все как посоветовали. И теперь вообще ничего не понимаю. Для тестирования создал интерфейс (без родителей) с одним методом Get5(). Реализовал его и еще 4 метода. Каждый пишет на экран соответствующую цифру - 1, 2, 3, 4, 5. Builder библиотека:
Qt использование:
Если оставить в реализации только одну функцию Get5(), валится с "Segmentation fault" В чем проблема? Подскажите, пожалуйста. |
| Автор: borisbn 4.4.2011, 19:16 |
| Хммм. Странно. Должно работать. 1. У деструктора не может быть никакого типа вызова (билдер это ещё кушает, а студия не должна). Но это не имеет отношения к делу. Так, ремарка 2. Покажи ф-цию Acreate_instance, а лучше весь тестовый проект Ты так и не сказал, какой у тебя компилятор. Qt - не компилятор, а набор h-ников, lib-ин и dll |
| Автор: nvrrus 5.4.2011, 10:46 | ||||
| Компилятор mingw. Вот функция CreateInstance, библиотеки Builder:
Так я ее выгружаю из библиотеки в Qt:
|
| Автор: xvr 5.4.2011, 10:55 |
| Кстати, деструкторы между mingw/Builder могут не работать. У разных компиляторов могут быть разные взгляды на способы реализации конструкторов и деструкторов |
| Автор: borisbn 5.4.2011, 11:11 |
| действительно, странно. сделал всё как у тебя, за исключением того, что у меня нет minGW, поэтому сделал в студии. У меня "выплёвывается" 5. см. аттач |
| Автор: nvrrus 5.4.2011, 12:38 | ||
| Спасибо, огромное, за участие. Я тоже сделал пустой проект в Qt. Беру интерфейс из вашей библиотеки. Get5() пишет "1".
Возможно в этом проблема. Можно ли что-то докрутить, чтобы деструкторы Builder нормально виделись mingw? |
| Автор: borisbn 5.4.2011, 12:42 | ||||
можно. Выкинуть деструктор. Добавить виртуальную ф-цию destroy, в реализации которой вызывать
|
| Автор: nvrrus 5.4.2011, 13:31 |
| Да, спасибо, это действительно было бы выходом. Но при отсутствии деструктора, все равно возникает та же проблема. |
| Автор: borisbn 5.4.2011, 13:47 |
| nvrrus, у меня две мишени: minGW (что-то они наглючили с вирт.таблицами) и ты 1. 2. Если между билдером и студией всё работает, а между minGW и билдером нет, то получается, что между студией и minGW не должно работать, а это, скорее всего, не так, т.к. minGW-шные библиотеки сплошь и рядом пользуют системные dll-ки, сделанные на студии Давай разбираться: у тебя в билдере и minGW точно подключаются один и тот же h-ник с описанием интерфейса ? Подключи его с полным путём и там и там. У тебя точно используется одна и та же dll-ка в билдере и в minGW ? Удали все dll-ки с этим именем, скомпиляй ей билдером, а потом подключай в minGW. |
| Автор: nvrrus 5.4.2011, 14:48 |
| Спасибо! Я бы рад ошибиться, да не где. Собираю проект dll, из этой же директории беру dll, когда выгружаю динамически функцию CreateInstance в Qt. |
| Автор: borisbn 5.4.2011, 15:52 |
| давай ещё одну проверочку попробуем: убери virtual у всех ф-ций GetX, кроме той, которая реализует интерфейс... |
| Автор: nvrrus 6.4.2011, 16:04 | ||
Валится с SegmentationFault |
| Автор: borisbn 6.4.2011, 16:46 |
| Был ещё один грешок за билдером... Попробуй "подчистить сопли", как мы это называем, билдеру: удалить (руками, не из IDE) все .obj, .tds, .#00 - .#0N и .csm файлы. Плюс убери деструктор - он всё равно не нужен, т.к. вызывать delete m_Src; нельзя, т.к. память, выделенная менеджером памяти билдера нельзя освобождать менеджером памяти minGW. Добавлено через 6 минут и 40 секунд minGW на работе нет. Вечером (дома) проверю. |
| Автор: borisbn 6.4.2011, 21:06 | ||
| nvrrus, проверил на minGW....... работает точно, как ты говорил. походу ты открыл очередной глюк . вот только не пойму в билдере или минГВ.
беру слова назад. с меня пиво |
| Автор: nvrrus 11.4.2011, 13:08 |
| Спасибо! Пересобрали библиотку в qt) |
| Автор: borisbn 11.4.2011, 13:17 |
не понял. если библиотека не была завязана на VCL, то зачем были эти извращения муки ? |