Qt — диалог в DLL

В моей компании мы разрабатываем с Embarcadero-C ++ — IDE (что очень неудобно). Чтобы начать уходить, мы портируем отдельные диалоги в dll на Qt. Мой qt-dll-код выглядит, например, так

extern "C" ROBOTECHPOLYLINEDIALOGSHARED_EXPORT void popupRoboTechDialog()
{
if( ! QApplication::instance() )
{
int argc = 1;
char *argv[] = {"Design polyline"};
QApplication app(argc, argv);
RoboTechPolyline dialog;
dialog.show();
app.exec();
}
else
{
RoboTechPolyline Dialog;
Dialog.exec();
}
}

Попытка запустить диалог из другого потока, как здесь Запуск Qt GUI из dll (в функции DLLStart) сделал мой диалог не отвечающим, но я не думаю, что мой вопрос слишком связан.

Я загружаю этот Dll динамически из основного приложения, и он отлично работает. Однако, когда я заставляю всплывающее диалоговое окно во второй раз, я получаю «Нарушение прав доступа по адресу .. в модуле MSVCR110D.dll», а в третий раз я получаю «Сбой ASSERT в QCoreApplication, должен быть только один объект приложения» , Поэтому мне всегда нужно закрывать приложение целиком, чтобы диалоговое окно появлялось во второй раз, что значительно замедляет работу.
Если я добавлю внизу строку

QApplication::quit()

Диалог появляется во второй раз, но программа закрывается при закрытии этого второго Диалога.
Код для загрузки DLL выглядит следующим образом

HINSTANCE lib = ::LoadLibrary(L"RoboTechPolylineDialog.dll");
if(!lib)
{
ShowMessage("Unable to load RoboTechPolylineDialog.dll");
return;
}

typedef void ( *POPUP_ROBO_TECH_DIALOG )();
POPUP_ROBO_TECH_DIALOG fp = (POPUP_ROBO_TECH_DIALOG) ::GetProcAddress(lib, "popupRoboTechDialog");

if(!fp)
{
ShowMessage("Unable to load function popupRoboTechDialog from RoboTechPolylineDialog.dll");
::FreeLibrary(lib);
return;
}

(*fp)( );

FreeLibrary(lib);

Так почему я создаю более одного приложения QApplication одновременно? Я могу в приведенном выше коде заменить строку

(*fp)();

с

(*fp)();
(*fp)();

и диалог появляется дважды, и все работает очень хорошо. Но как вызов :: FreeLibrary (lib) может привести к сбою.

Может кто-нибудь мне помочь? Любая помощь, обходные пути и т.д .. ценится.

1

Решение

Это должно работать:

#include <QApplication>
#include <QString>
#include <QDialog>

class App {
QApplication *_app;
public:
App(int argc = 0, char** argv = NULL)
: _app(new QApplication(argc, argv))
{

}

~App() {
delete _app;
}
};

void dialog()
{
static int argc = 1;
static char *argv[] = {"Design polyline"};
static App(argc, argv);
QDialog dlg;
dlg.exec();
}

void main()
{
dialog();
dialog();
dialog();
}
2

Другие решения

Другой совет: загружайте библиотеки Qt из подпути, так как вы можете столкнуться с конфликтом DLL с другими приложениями, использующими его в той же папке (личный опыт)

0

По вопросам рекламы [email protected]