0

こんにちは、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 アプリケーションが閉じますか?

他にお手伝いできることがあれば、お尋ねください。喜んでお手伝いします。

助けようとするすべての人に感謝します。

4

1 に答える 1

-2

WinApi を使用する場合は、コードの他の部分からスレッドハンドルにアクセスできるようにする必要があります。次に、スレッドを終了するには、ExitThread を使用できます。これは、MSDN が推奨するオプションです。私はあなたがそれをどのように使用できるかを示します:

DWORD threadID;
HANDLE hthread;
void TerminateYourThread()
{
  DWORD exitCode;
  if(GetExitCodeThread(hThread,&exitCode) != 0) // check if your thread is active
  {
    ExitThread(exitCode); // terminating thread

    if(CloseHandle(hThread)) // closing handle
    {
       //
    }
  }
}

void CreateYourThread()
{
   hThread = CreateThread( NULL , 0 , 
                        (LPTHREAD_START_ROUTINE)TabelaSvihObjekata , 
                        (void*)hwnd , 0 , &threadID );
}

スレッドを終了したい場合は、TerminateYourThread 関数を呼び出すだけです。スレッドが閉じられるまで待機します。これは単なる提案であり、最終的な解決策ではないため、将来的にリファクタリングできます。

于 2013-08-10T17:55:01.927 に答える