【问题标题】:win32 API createFile function: converting to an LPCTSTRwin32 API createFile 函数:转换为 LPCTSTR
【发布时间】:2012-06-01 16:59:36
【问题描述】:

我有以下代码从函数中获取文件名,然后将其传递给 createFile(扩展为 createFileA)。较早的一个问题告诉我使用 file.c_str() 将文件名转换为 createFileA 使用的 LPCTSTR。但是,这不起作用,因为每次调用 createFileA 时文件的句柄都无效。我做错了什么?

string file = getFilename();
HANDLE hf = CreateFile(file.c_str(),GENERIC_READ | GENERIC_WRITE,(DWORD) 0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
if (hf == INVALID_HANDLE_VALUE)
   {
     MessageBox( hwnd,"CreateFile","Error", MB_OK);
   }

【问题讨论】:

  • GetLastError 返回什么错误码?
  • ERROR_INVALID_NAME 123 (0x7B) 文件名、目录名或卷标语法不正确。
  • 如果你在调试器下运行,file.c_str() 会返回什么?
  • 对不起,我应该在错误中包含它:它返回 2012-6-1_17:10:40:475.bmp
  • 哇,我应该想到这一点,但冒号在 Windows 文件名中是非法的。感谢您的帮助。

标签: c++ winapi


【解决方案1】:

如果它可以编译,那么 .c_str() 必须是正确的类型!

ERROR_INVALID_NAME 的最常见原因是文件名中的非法字符、额外的“:”或制表符,或者您使用了保留的文件名。检查文件名的值

【讨论】:

    【解决方案2】:

    根据问题上的 cmets,问题是您提供的名称包含 :。此字符对于 Windows 中的文件名是非法的,并且是问题的根源。删除该字符,代码应该可以正常工作

    【讨论】:

      【解决方案3】:

      我刚刚注意到,如果您使用以下代码

      std::stringstream ss; ss

      然后执行 ss.str() 以获取 std::string。 然后如果你做 c_str() 来传递给 CreateFile

      这不适用于 CreateFile 并且很难跟踪根本原因 但它是“endl;”,它被流式传输到缓冲区中,因此路径将无效

      总会报错123 文件名无效

      宽版也会出现这种情况。

      【讨论】:

        猜你喜欢
        • 2011-11-03
        • 2017-11-10
        • 2016-06-07
        • 2018-06-02
        • 1970-01-01
        • 2016-07-11
        • 1970-01-01
        • 2012-12-14
        • 2011-09-29
        相关资源
        最近更新 更多