Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Программа на Qt крушится при многократном использовании функции из DLL
Просмотров: 372
 
Ответов: 5
Создаю чистый проект в Qt Creator. В конструкторе формы подключаю DLL и пытаюсь многократно использовать функцию из DLL:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QLibrary *library = new QLibrary("UniversalDLL.dll");
typedef int (*testFunc)(int);
testFunc tst = (testFunc) library->resolve("wrr");
if (!tst)
{
QMessageBox::critical(this, this->windowTitle(), tr("Error loading DLL!"));
exit(0);
}
qDebug() << tst(1);
qDebug() << tst(2);
qDebug() << tst(3);
qDebug() << tst(4);
qDebug() << tst(5);
qDebug() << tst(6);
qDebug() << tst(7);
qDebug() << tst(8);
qDebug() << tst(9);
qDebug() << tst(10);
qDebug() << tst(11);
qDebug() << tst(12);
qDebug() << tst(13);
qDebug() << tst(14);
qDebug() << tst(15);
}
DLLка лежит в папке с проектом и успешно подключается, в ней одна единственная функция (проект DLL создан в Visual Studio):
extern "C" __declspec(dllexport) int __stdcall wrr(int abonent)
{
return abonent;
}
Крах программы происходит как в release, так и в debug, причем количество использований функции до крушения программы разное в debug и relese:
C:\testettstettd\release\testettstettd.exe завершился с кодом -1073741819
Например, сейчас, в release крушится на 7 итерации использования функции из DLL, а в debug (уже странно?!) перестало крушится.
Однократное использование функции из DLL работет. Что за ерунда, третий день пошел, как пытаюсь разобраться. Пробовал подключать и без использования QLibrary и динамически и статически. Проблема скорее всего не в DLL, т.к. проверял на разных дллках и DLL из проекта на Delphi успешно подключается и работает. Ну и как водится: ПАААМАГИИИТЕЕ!?
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QLibrary *library = new QLibrary("UniversalDLL.dll");
typedef int (*testFunc)(int);
testFunc tst = (testFunc) library->resolve("wrr");
if (!tst)
{
QMessageBox::critical(this, this->windowTitle(), tr("Error loading DLL!"));
exit(0);
}
qDebug() << tst(1);
qDebug() << tst(2);
qDebug() << tst(3);
qDebug() << tst(4);
qDebug() << tst(5);
qDebug() << tst(6);
qDebug() << tst(7);
qDebug() << tst(8);
qDebug() << tst(9);
qDebug() << tst(10);
qDebug() << tst(11);
qDebug() << tst(12);
qDebug() << tst(13);
qDebug() << tst(14);
qDebug() << tst(15);
}
{
return abonent;
}
Могу посоветовать сделать функцию без модификатора __stdcall и попробовать собрать Qt в Debug, а там подцепить сырцы Qt и посмотреть где выходит ошибка.
Однако, данная ошибка больше смахивает на Access violation или Stack overflow. Советую проверить код на других машинах с windows. Если проблема сохраняется — возможно, перегрузка стека, что, кстати, не удивительно, ведь __stdcall означает что аргументы передаются через стек.
Увы, я не могу никак прокомментировать данную ошибку и поведение в среде Windows, но советую проанализировать его без такого модификатора, или заменив на какой другой.
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться