在我的公司,我们正在使用 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();
}
}
尝试从另一个线程启动对话框,例如从 dll 启动 Qt GUI(在 DLLStart 函数中)确实使我的对话框无响应,但我认为这个问题和我的问题没有太大关系。
我正在从主应用程序动态加载这个 Dll,它工作正常。但是,当我第二次弹出对话框时,我得到“在模块 MSVCR110D.dll 中的地址访问冲突”,第三次,我得到“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) 的调用如何使事情失败。
谁能帮我?任何帮助、解决方法等都表示赞赏。