我正在使用以下代码来创建文件,但是它总是使用错误代码123失败(路径语法无效)。

奇怪的是: path_ok 总是可以,但是 path_err 总是失败123。失败后,缓冲区 path_err 指向要清除。

有人可以向我介绍一下吗?我已经检查了两个指针的记忆,它们的内容似乎是相同的。

非常感谢。

 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 ); 

compatedumpFileName()函数是这样:

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();

组合fileName返回后,其堆栈框架无效,但是,其局部变量 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可以拥有,因此它抱怨无效的路径语法。

这是我目前的理解,如果我错了,请纠正我。

谢谢。

有帮助吗?

解决方案

主要问题 使用您的代码是您要返回的缓冲区在堆栈上,这是一个很大的否:

 // 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]; 

或将缓冲区传递到功能中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top