-1

次の関数を使用して、OPENFILENAME を使用してダイアログ ボックスを開きます。問題は、ダイアログ ボックスを開いて閉じた後、すべて正常に動作するのに、アプリケーションを終了すると Windows がクラッシュしたと表示することです。

bool openDialog()
{
  OPENFILENAME ofn;       // common dialog box structure
  char szFile[260];       // buffer for file name
  HWND hwnd = NULL;       // owner window
  HANDLE hf;              // file handle

  // Initialize OPENFILENAME
  ZeroMemory(&ofn, sizeof(ofn));
  ofn.lStructSize = sizeof(ofn);
  ofn.hwndOwner = hwnd;
  ofn.lpstrFile = szFile;
  //
  // Set lpstrFile[0] to '\0' so that GetOpenFileName does not 
  // use the contents of szFile to initialize itself.
  //

  ofn.lpstrFile[0] = '\0';
  ofn.nMaxFile = sizeof(szFile);
  ofn.lpstrTitle = "Open File";
  ofn.lpstrFilter = "Custom File\0*.Cus\0";

  ofn.nFilterIndex = 1;
  ofn.lpstrFileTitle = NULL;
  ofn.nMaxFileTitle = 0;
  ofn.lpstrInitialDir = NULL;
  ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

  // Display the Open dialog box. 

  if (GetOpenFileName(&ofn) == true) 
  {
    path = ofn.lpstrFile;
    return true;
  }
  else
  {
    return false;
  }
}

クラッシュは実行時にのみ発生するため、ダイアログボックスであることに気付きました。つまり、ある時点でダイアログボックスを開かずにアプリケーションを閉じると、正常に終了します。

とにかく、私が調査した限りでは、おそらく「ヒープの破損」または私がよく知らない同様のことが原因である可能性が高いため、アプリケーションを閉じようとすると、必要に応じてメモリが解放されません (? )。誰かが解決策を見つけ出すことができれば、それは大歓迎です。

4

1 に答える 1

1

ほとんどのpath場合、問題は、これが単にconst char *orchar *が関数の外部で宣言されている場合に関係しています。

openDialog関数が戻ると、型の構造体と文字配列の両方が(ofnOPENFILENAMEszFileすべてのローカルのスタック割り当て変数と共に) 範囲外になり、有効ではなくなります。ofn.lpstrFileその結果、結果的に指し示す文字配列pathは無効になります。

関数の外側にファイル名用のスペースを割り当て、関数から戻る前にstrcpy、または同等の方法でコピーを実行する必要があります。strncpyもう 1 つの方法は、szFile文字配列を関数の外に移動し、それを含むクラスにメンバー変数として移動することです。いずれにせよ、返されるファイル名を含む文字配列のスコープは、関数の実行期間を超えて拡張する必要がありopenDialogます。

于 2013-08-08T17:31:34.590 に答える