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获取错误码。 在处理字符串时使用strcpystrcat 而不是memcpy。 也就是说,您的代码要求溢出缓冲区。如果这确实是 C++,请使用 std::string 并让该类管理缓冲区。 没有真正的理由相信可执行文件位于当前工作目录中。

【讨论】:

以上是关于CreateFile 返回无效的句柄值的主要内容,如果未能解决你的问题,请参考以下文章

CreateFileWriteFileReadFile

在 C# 中设置 USB 键盘状态

Windows 内核开发设备句柄无效的句柄值

怎么得到已经打开的文件的句柄

WinApi FindFirstFile 和文件句柄

CreateFile()函数的返回值,具体点的,有例子