2017-10-08 70 views
-3

我有下面的代码:C++ ReadFile的崩溃问题

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; 

我KernelBase.dll每个我打电话ReadFile的时候得到一个访问冲突(0000005)。 此外,的CreateFile显示

File Handle: 0000000000000040 

所有的时间,我也不太清楚,如果这是正常的正常处理与否。

Full Code, with error from debugger, VS2017

编辑:如果我打印的文件的大小,它示出了18

+0

该代码工作正常,我读一个160MB左右的文件。如果错误出现在您未显示的代码中,您可能会显示一个完整的示例。 –

+0

我试着只执行我从主函数上面发布的代码(没有其他任何东西),它仍然崩溃 – NVMESSD

+0

发布完整的代码和任何错误,你在问题的正文中得到的文本。 –

回答

4

从ReadFile的的MSDN文档:

lpNumberOfBytesRead [出,可选]

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

试试这个:

DWORD read; 
if (!ReadFile(hFile, fileBuffer, fileSize, &read, NULL)) std::cout << "Failed to read file " << GetLastError() << std::endl; 
+1

是的,我刚刚看到并撤消了我的评论。当它为空时,它不会在Windows 10上引起任何问题。也许OP是在一个较旧的操作系统上,当byteRead ptr为空时会崩溃......这只是一个猜测。 – selbie

+0

@selbie - 是的,在旧的Windows版本* ReadFile *写入* lpNumberOfBytesRead *如果* lpOverlapped *为0。从8.1开始(或者可能是7,我现在不检查)* ReadFile *检查* lpNumberOfBytesRead *为0值,而不是在这种情况下写入它 – RbMm