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が描画するようになっています。
ウィンドウの閉じるボタンを押すと、閉じることはできますが、タスクマネージャーを見ると、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); を実行すると、うまくいかない様です。