WindowsでQtでOCX

Windows上でQtを使ってOCX(ActiveXコントロール)を作っています。

https://github.com/soramimi/ActiveQtExample

↑ここまでできています。

MyControlとMyAppというプロジェクトがあります。前者はOCXです。後者はexeアプリケーションで、メインウィンドウにOCXが貼り付けてあります。

それぞれのプロジェクトをリリースビルドします。

build/release フォルダに移動します。Qt SDKのbinフォルダから、Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dllの3つをコピーします。続いて、

regsvr32 MyControl.dll

を実行して、コントロールを登録します。(登録解除するには /u を付けて実行します)

MyApp.exeを実行すると、ウィンドウが表示され、楕円が描画されます。メインウィンドウはMyApp.exeが表示し、楕円はMyControl.dllが描画するようになっています。

activeqt

ウィンドウの閉じるボタンを押すと、閉じることはできますが、タスクマネージャーを見ると、MyApp.exeが残ったままになっています。

本家フォーラムにも、同様な現象が報告されているのですが、進展がないようです。

この不具合は、MyApp.exeがリリースビルドの時だけ発生し、デバッグビルドにすると、正常に動作するようです。

また、MyAppのメインウィンドウに、下記のようなコードを追加すると、プロセスは終了しますが、根本的な解決ではないような気がします。

#include <windows.h>

void MainWindow::closeEvent(QCloseEvent *e)
{
    PostQuitMessage(0);
    QMainWindow::closeEvent(e);
}

開発環境: Windows 7 (64bit)  / MSVC2013 / Qt5.5.1


これは仕様っぽい?

https://bugreports.qt.io/browse/QTBUG-29116

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    QObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit()));
    return a.exec();
}

最後のウィンドウが閉じたときに、アプリケーションを終了する、って明示的に書かないといけないのかな。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    a.setQuitOnLastWindowClosed(true);
    return a.exec();
}

これでもいいみたい。ただし、 w.show(); より先に a.setQuitOnLastWindowClosed(true); を実行すると、うまくいかない様です。

カテゴリー: 未分類   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

CAPTCHA(画像認証)

上の画像の最初と最後を除いた3桁の数字を入力して、送信ボタンを押してください。