CreateFile 返回无效的句柄值
Posted
技术标签:
【中文标题】CreateFile 返回无效的句柄值【英文标题】:CreateFile returns invalid handle value 【发布时间】:2017-04-02 10:59:46 【问题描述】:我正在尝试从 exe 文件所在的目录中读取文件。 data.txt 文件位于 VS Project 目录中,当我指定完整路径时,一切正常。
char curDirectory[MAX_PATH];
GetCurrentDirectory(MAX_PATH, curDirectory);
char filePath[MAX_PATH];
char *name = "\\data.txt";
memcpy(filePath, curDirectory, sizeof(curDirectory));
memcpy(filePath + strlen(curDirectory), name, strlen(name));
HANDLE hFile = CreateFile(filePath, GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
【问题讨论】:
不要使用memcpy()
之类的东西构建文件路径字符串。改用更像PathCombine()
的东西。并且GetCurrentDirectory()
不保证会报告EXE所在的文件夹。请改用GetModuleFileName()
并从中删除文件名,例如使用PathRemoveFileSpec()
。
【参考方案1】:
你不会空终止字符串。通过在第二次调用中将strlen(name) + 1
传递给memcpy
来执行此操作。
其他一些观察:
当CreateFile
失败时,应调用GetLastError
获取错误码。
在处理字符串时使用strcpy
和strcat
而不是memcpy
。
也就是说,您的代码要求溢出缓冲区。如果这确实是 C++,请使用 std::string
并让该类管理缓冲区。
没有真正的理由相信可执行文件位于当前工作目录中。
【讨论】:
以上是关于CreateFile 返回无效的句柄值的主要内容,如果未能解决你的问题,请参考以下文章