我使用以下代码创建文件,但它始终失败,错误代码为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返回后,其堆栈帧无效,但其堆栈上仍存在其本地变量 WCHAR dump_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可能有,所以它抱怨路径语法无效。
这是我目前的理解,如果我错了,请纠正我。
感谢。
答案 0 :(得分:16)
一个主要问题与你的代码是你要返回的缓冲区在堆栈上,这是一个很大的不,没有:
// build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP
WCHAR dump_file_path[MAX_PATH];
将其更改为静态:
// build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP
static WCHAR dump_file_path[MAX_PATH];
或将缓冲区传递给函数。