1

私の会社では、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 をメイン アプリケーションから動的にロードしていますが、正常に動作します。ただし、ダイアログポップアップを2回目にすると、「モジュールMSVCR110D.dllのアドレス..でアクセス違反」が発生し、3回目には「 QCoreApplication でASSERTエラーが発生しました。アプリケーションオブジェクトは1つだけである必要があります」 . そのため、ダイアログをもう一度表示するには、常にアプリケーション全体を閉じる必要があり、作業が大幅に遅くなります。行の一番下に追加すると

QApplication::quit()

ダイアログは 2 回目に表示されますが、この 2 回目のダイアログを閉じると Programm がクラッシュします。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)();

ダイアログが2回表示され、すべてがうまく機能します。しかし、::FreeLibrary(lib) を呼び出すと、どうすれば失敗するのでしょうか。

誰でも私を助けることができますか?ヘルプ、回避策などは大歓迎です。

4

2 に答える 2

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();
}
于 2015-06-19T16:31:06.360 に答える