c++ - Qt - DLL 中的对话框

标签 c++ qt dll qapplication qcoreapplication

在我的公司,我们正在使用 Embarcadero-C++-IDE 进行开发(这很不舒服)。为了开始移动,我们将 dll 中的单个对话框移植到 Qt。例如,我的 qt-dll-code 看起来像这样

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(); 
    }  
}

像这里一样尝试从另一个线程启动对话框 Starting Qt GUI from dll (in DLLStart function)确实让我的 Dialog 没有响应,但我认为这个问题和我的问题没有太大关系。

我正在从主应用程序动态加载这个 Dll,它工作正常。但是,当我第二次弹出对话框时,我得到一个“地址访问冲突......在模块 MSVCR110D.dll 中”,第三次,我得到“QCoreApplication 中的 ASSERT 失败,应该只有一个应用程序对象” .所以我总是需要关闭整个应用程序以使对话框再次出现,这大大减慢了工作速度。 如果我在底部添加一行

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) 怎么会导致失败。

谁能帮帮我?感谢任何帮助、解决方法等。

最佳答案

这应该有效:

#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();
}

关于c++ - Qt - DLL 中的对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30908069/

相关文章:

.net - Visual Studio 引用和版本控制 - 它是如何工作的?

c++ - 退出应用程序并在 MFC 中返回代码

c++ - Qt 在 .dll 中使用 .dll

c++ - macOS 中的 CMake,预编译头文件 (.pch) 支持

c++ - Qt QML listview布局不调整大小

c++ - 如何将 QStandardItem 附加到两行中

c++ - SDL/C++ : How to make this function short(er)?

c++ - 管理在信号中传递给 QML 的 C++ QObject 的生命周期

c++ - 查找dll的依赖模块

c# - 使用安全模式从 dll 中获取 char**(作为 (IntPtr) 参数传递给函数)