0

ファイルパス、名前、拡張子を返すためのツールとして使用したい簡単なファイル保存ダイアログがあります。この関数は、ファイル名周辺のスタックが破損していることを示すランタイムエラーを生成します。私はそれをそのように使いたい:

wchar_t filename[] = L"";
newGradebookDialog( hwnd, filename );

そして、これが私の機能です。期待どおりにファイル名を変更しますが、ランタイムスタックエラーが発生しません。

void newGradebookDialog( HWND hwnd, wchar_t file[] )
{
 OPENFILENAME ofn;

 wchar_t saveFileName[MAX_PATH] = L"";

 ZeroMemory( &ofn, sizeof( ofn ) );

 ofn.lStructSize = sizeof(OPENFILENAME);
 ofn.hwndOwner = hwnd;
 ofn.lpstrFilter = L"Database File (*.db)\0*.db\0";
 ofn.lpstrFile = saveFileName;
 ofn.nMaxFile = MAX_PATH;
 ofn.lpstrDefExt = L"db";
 ofn.Flags  = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
 ofn.lpstrTitle = L"Save New Database";

 if(GetSaveFileName(&ofn))
  wcscpy(file,saveFileName);
}
4

3 に答える 3

9
 wchar_t filename[] = L"";

これは、1つの要素を持つ配列です。はるかに大きな文字列をコピーしているため、スタックフレームが破損しています。修理:

 wchar_t filename[MAX_PATH] = {0};
于 2011-01-09T16:09:38.867 に答える
1

wcscpyを介してメモリが破損しているように感じます。空の「ファイル名」を割り当て、空でない値(saveFileNameから)をコピーして、メモリを破損しています。

また、MAXPATHではなくMAXPATH + 1要素を割り当てることにより、末尾の\0用のスペースを予約することをお勧めします。この特定の場所では必要ないかもしれませんが、もう1つの文字を予約すると、メモリ破損のバグ追跡にかかる時間を節約できる場合があります。

于 2011-01-09T16:11:10.467 に答える
0

試す

wchar_t filename[MAX_PATH]
于 2011-01-09T16:10:16.957 に答える