Qt - DLL中的对话

时间:2015-06-18 06:33:46

标签: 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确实使我的Dialog没有响应,但我不认为这个问题与我的关系太多了。

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

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)会使事情失败。

任何人都可以帮助我吗?任何帮助,变通办法等等。非常感谢。

2 个答案:

答案 0 :(得分:2)

这应该有效:

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

答案 1 :(得分:0)

另一个建议:从子路径加载Qt库,因为你可能会发现dll与在同一个文件夹上使用它的其他应用程序冲突(个人经历)