こんにちは、StackOverflow の同僚です。
私は簡潔にしようとするので、ポイントに切り込みます:
Windows XP で C++ を使用し、純粋な Win32 を使用してダイアログ ボックスを作成しています。
このダイアログ ボックスには、いくつかの編集コントロールと、押されたときにスレッドをアクティブにする [OK] ボタンがあります。
その後、スレッドは編集コントロールからテキストを収集し、OLE オートメーションを使用して MS Word ドキュメントに書き込みます。
OKボタンを押すと、すべて正常に動作し、スレッドが塗りつぶされたWord文書を表示するのを待ちます。
しかし、スレッドの途中で OK ボタンを押してダイアログを閉じると、空白の Word 文書が表示されます。
私の問題をさらに説明するために、いくつかのコード スニペットを示します。
これは、スレッド関数のスニペットです。
DWORD WINAPI TabelaSvihObjekata( LPVOID hWnd ) // hWnd is handle of the Dialog box
{
// obtain dialogs window handle
HWND hwnd = (HWND)hWnd;
// Initialize COM for this thread...
CoInitialize(NULL);
// Get CLSID for our server...
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Word.Application", &clsid);
// do other Automation stuff and clean afterwards
}
ダイアログ ボックスでは、これはボタン ハンドラーのスニペットです。
case IDOK:
{
// create thread
DWORD threadID;
HANDLE threadHandle = CreateThread( NULL , 0 ,
(LPTHREAD_START_ROUTINE)TabelaSvihObjekata ,
(void*)hwnd , 0 , &threadID );
if( !threadHandle )
{
MessageBox( hwnd, L"Error", L"Error", MB_ICONERROR );
EndDialog( hwnd, IDCANCEL );
}
CloseHandle( threadHandle );
}
そして、これは問題のあるハンドラです:
case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
break;
手がかりを求めてMSDNを調べたところ、解決策としてExitThreadしか見つかりませんでしたが、スレッドの経験が浅いため、適切に使用する方法がわかりません。
SOアーカイブをブラウズすると、ブール変数を導入し、whileループでその値をテストするC#の例がいくつか見つかりました。これにより、スレッドを中止するか、機能させるかを決定できます。スレッドが配置される別の方法が提案されましたプロセスを分離してから強制終了します。
私の質問は:
何を追加または変更すればよいので、ダイアログ ボックスを閉じると、スレッドの破棄と共に Word アプリケーションが閉じますか?
他にお手伝いできることがあれば、お尋ねください。喜んでお手伝いします。
助けようとするすべての人に感謝します。