次のコードを使用してファイルを作成していますが、常にエラーコード123で失敗しました(パス構文が無効です)。
奇妙なことに、 path_okは常に問題ありませんが、path_errは常に123で失敗しました。失敗後、path_errが指すバッファーはクリアされます。
誰かが私に光を当てることができますか?2つのポインタのメモリを確認しましたが、内容は同じようです。
どうもありがとう。
WCHAR *pDumpFileName = ComposeDumpFileName();
WCHAR *path_ok = _T("d:\\myapp_Utopia_2010-11-15_04-22-05.dmp");
WCHAR *path_err = pDumpFileName;
::wprintf(pDumpFileName);
HANDLE hFile = ::CreateFileW( pDumpFileName, GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
ComposeDumpFileName()関数は次のようになります。
WCHAR* ComposeDumpFileName(void)
{
// get the time
SYSTEMTIME sys_time;
::GetSystemTime(&sys_time);
// get the computer name
WCHAR computer_name[MAX_COMPUTERNAME_LENGTH + 1];
DWORD computer_name_len = ARRAYSIZE(computer_name);
::GetComputerNameW(computer_name, &computer_name_len);
// build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP
WCHAR dump_file_path[MAX_PATH];
::swprintf_s(dump_file_path, ARRAYSIZE(dump_file_path),
_T("d:\\myapp_%s_%04u-%02u-%02u_%02u-%02u-%02u.dmp"),
computer_name, sys_time.wYear, sys_time.wMonth, sys_time.wDay,
sys_time.wHour, sys_time.wMinute, sys_time.wSecond);
return dump_file_path;
}
アップデート
上記のコードで、次のコードを実行すると、次のようになります。
WCHAR *pDumpFileName = ComposeDumpFileName();
ComposeDumpFileNameが返された後、そのスタックフレームは無効ですが、そのローカル変数WCHARdump_file_path[MAX_PATH]はまだスタックに存在します。したがって、これは、そのスタックスペースがすでに無効であるにもかかわらず、そのコンテンツを引き続き表示できる理由を説明しています。
次に、次のステートメントを実行します。
::wprintf(pDumpFileName);
HANDLE hFile = ::CreateFileW( pDumpFileName, GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
wprintf()とCreateFileW()には、独自のスタックフレームがあります。デバッガーでは、wprintf()のスタックフレームがpDumpFileNameが指すメモリコンテンツを破壊しなかったことがわかりました。CreateFileWが持つ可能性があるため、無効なパス構文について文句を言います。
これは私の現在の理解です。間違っている場合は訂正してください。
ありがとう。