私は mdi を使用するアプリケーションを使用しており、スクリプトを mdi ウィンドウにアタッチしたり、mdi ウィンドウから切り離したりして、オンデマンドで実行/停止することができます。このスクリプトは、何らかの作業を行う dll をロードします。それはうまくいきます。ただし、スクリプトをデタッチしてもすべて問題なく、アプリケーションは dll をアンロードする必要があります (適切な thread_attach/detach および process_attach/detach 操作で dllmain を呼び出します)。スクリプトをウィンドウに再アタッチしようとしたり、別のウィンドウにアタッチしようとすると、dll が一度使用された後、メイン アプリケーションがクラッシュします。dll によって作成されたスレッドに問題を特定しました。トレッドは窓を作ります。だから、私は次のようにスレッドを作成します:
if (!hThread) hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
そして、スクリプトがデタッチされると、次のようにスレッドをシャットダウンします (コメントアウトされた行がコメントアウトされていなくても):
SendMessage(hWnd, WM_DESTROY, 0, 0);
//TerminateThread(hThread, 0);
//WaitForSingleObject(hWndThread, INFINITE);
CloseHandle(hThread);
hThread = NULL;
メインアプリがクラッシュする理由について、ここで途方に暮れています。別のスレッド (つまり、単純に 1 秒間スリープしてループするスレッド) は、害を及ぼすことはありません。