3

CDialog ベースのアプリケーションを閉じようとしています。CWnd::OnClose() を呼び出すと、デバッガーが Windows システム ファイルに入ります。デバッガーの出力ウィンドウで、これらのループ行が無期限に表示されます。

スレッド 'Win32 スレッド' (0x1040) はコード 0 (0x0) で終了しました。スレッド 'Win32 スレッド' (0x2fa4) はコード 0 (0x0) で終了しました。スレッド 'Win32 スレッド' (0x1ca0) はコード 0 (0x0) で終了しました。'LifescanDatabaseApplication.exe': アンロードされた 'C:\Windows\SysWOW64\davclnt.dll' 'LifescanDatabaseApplication.exe': アンロードされた 'C:\Windows\SysWOW64\davhlpr.dll' 'LifescanDatabaseApplication.exe': ロードされた 'C:\Windows \SysWOW64\davclnt.dll'、PDB ファイルが見つからないか、開くことができません 'LifescanDatabaseApplication.exe': Loaded 'C:\Windows\SysWOW64\davhlpr.dll', PDB ファイルが見つからないか、開くことができません

私が壊したもの、またはそれを追跡する方法についてのアイデアはありますか? ありがとう、ジェームズ

編集 ダイアログの OnClose() 関数をここに示します。

void CApplicationDlg::OnClose()
{
    UpdateData(TRUE);
    if(AfxMessageBox(_T("Are you sure you want to close? If so, no more updates will be issued"),MB_YESNO)==IDYES)
    {
    Logger * instance = Logger::Instance();
    if(instance!=nullptr)
    {
      instance->writeToLogFile("Application shutdown.");
    }
        CWnd::OnClose();
    }
}

Cwnd::OnClose() コマンドを使用して、デバッガーでこれを追跡しました。問題は、コードが、ダイアログ ボックスを呼び出して EndDialog を実行する部分に戻っていないことです。この作業を停止しているダイアログ ボックス コードのどこかを変更したと思います。

編集 2: CWnd::OnClose() を this->EndDialog(0) に置き換えると問題が解決するように見えますが、これは心配です。

4

2 に答える 2

1

http://msdn.microsoft.com/en-us/library/866bc849(v=vs.80).aspxのドキュメントでCWnd::OnCloseを確認する必要があります。これは、発生したイベントに応答して呼び出される関数であることがわかります。ウィンドウは、ウィンドウを閉じる必要があることを示すWM_CLOSEメッセージを受信して​​います単に呼び出すだけではウィンドウは閉じません。

適切なリターンコードhttp://msdn.microsoft.com/en-us/library/wddd3ztw%28v=vs.80%29.aspxを使用してEndDialogを呼び出す必要があります。

于 2012-10-23T23:19:39.993 に答える
1

実際の問題は、ボタンの ID の混乱でした。これは、完了までに非常に長い時間がかかるメソッドの実行を引き起こすハンドラが呼び出されたことを意味していました。

それを修正し、すべてが機能しました。でも助けてくれてありがとう

于 2012-11-02T11:54:46.260 に答える