C++ ReadFile崩溃问题

NVM*_*SSD -3 c++ windows winapi

我有以下代码:

HANDLE hFile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
    OPEN_EXISTING, 0, NULL); 
std::cout << "File Handle: " << hFile << std::endl;

DWORD fileSize = GetFileSize(hFile, NULL);
PVOID fileBuffer = VirtualAlloc(NULL, fileSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (!fileBuffer) std::cout << "Couldn't allocate memory " << GetLastError() << std::endl;
// Read the DLL
if (!ReadFile(hFile, fileBuffer, fileSize, NULL, NULL)) std::cout << "Failed to read file " << GetLastError() << std::endl;
Run Code Online (Sandbox Code Playgroud)

每次调用ReadFile时,我都会在KernelBase.dll中遇到访问冲突(0xC0000005).此外,CreateFile显示

File Handle: 0000000000000040
Run Code Online (Sandbox Code Playgroud)

一直以来,我都不太确定这是不是正常的手柄.

完整代码,调试器出错,VS2017

编辑:如果我打印文件大小,它显示18.

Ste*_*eve 5

从ReadFile的MSDN文档:

lpNumberOfBytesRead [out,optional]

指向变量的指针,该变量接收使用同步hFile参数时读取的字节数.在进行任何工作或错误检查之前,ReadFile将此值设置为零.如果这是一个异步操作以避免可能的错误结果,请对此参数使用NULL.仅当lpOverlapped参数不为NULL时,此参数才可以为NULL.有关更多信息,请参阅"备注"部分.

试试这个:

DWORD read;
if (!ReadFile(hFile, fileBuffer, fileSize, &read, NULL)) std::cout << "Failed to read file " << GetLastError() << std::endl;
Run Code Online (Sandbox Code Playgroud)

  • 是的,我刚看到它并撤销了我的评论.当它为null时,它不会在Windows 10上引起任何问题.也许OP是在较旧的操作系统上,当byteRead ptr为空时会崩溃...这只是猜测. (2认同)