Задать вопрос

Программа на Qt крушится при многократном использовании функции из DLL

Создаю чистый проект в 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 успешно подключается и работает. Ну и как водится: ПАААМАГИИИТЕЕ!?
  • Вопрос задан
  • 4219 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
DeNnEr
@DeNnEr
Могу посоветовать сделать функцию без модификатора __stdcall и попробовать собрать Qt в Debug, а там подцепить сырцы Qt и посмотреть где выходит ошибка.
Однако, данная ошибка больше смахивает на Access violation или Stack overflow. Советую проверить код на других машинах с windows. Если проблема сохраняется — возможно, перегрузка стека, что, кстати, не удивительно, ведь __stdcall означает что аргументы передаются через стек.
Увы, я не могу никак прокомментировать данную ошибку и поведение в среде Windows, но советую проанализировать его без такого модификатора, или заменив на какой другой.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
adminimus
@adminimus
как я понял dll и сам проект собираются разными компиляторами? Может тогда в __stdcall дело?
Ответ написан
Комментировать
@MikhailEdoshin
Я бы попробовал __stdcall объявить и в typedef?
Ответ написан
Комментировать
Aidsoid
@Aidsoid Автор вопроса
Всем спасибки за ответы, завтра на работе попробую убрать __stdcall.
Ответ написан
Комментировать
Aidsoid
@Aidsoid Автор вопроса
Спасибо, вы все были правы. Убрал __stdcall и всё заработало как часы. Только причина не очень ясна, т.к. еще не знаком со стеком. Буду читать и посвящаться, также буду признателен за ссылки, где это доступно объяснено.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект