win32 API createFile函数:转换为LPCTSTR

时间:2012-06-01 16:59:37

标签: c++ winapi

我有以下代码从函数中获取文件的名称,然后将其传递给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);
   }

3 个答案:

答案 0 :(得分:2)

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

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

的值

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

std :: stringstream ss; ss<< “C:\ filename.txt”<

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

这对CreateFile无效,很难跟踪根本原因 但它的“endl;”,它被流式传输到缓冲区,因此路径无效

它将始终报告错误123无效文件名

宽版本也会发生这种情况。