我有一个非常奇怪的问题。我一直在使用ReadFile()从通过USB连接到PC的设备读取数据。由于要读取的数据是以64字节的块接收的,所以总是调用ReadFile(),读取64字节。但是,当我必须读取小于64字节的帧时,偶尔会发生崩溃。
我将举一个代码的例子:
//Memory allocation done to read 100 bytes from device - This value is known in prior and hence memory is allocated exactly
new(100bytes);
// First read of 64 bytes
ReadFile(64)
// Second read of 64 bytes
ReadFile(64)
- >这里将从设备发送的数据仅为100-64 = 36.因此,即使我说64字节的读取,也不存在大于36字节的数据的情况。因此,这段代码应该可行(虽然我知道分配更少的内存并调用ReadFile的大小大于内存分配是不正确的。)
问题:如果数据读取的次数超过内存分配的数量,则ReadFile()会崩溃(尽管我们知道需要读取的数据的确切大小是多少)
PS:这种实现的原因是开发代码设计中的一个小缺陷。
答案 0 :(得分:1)
完全有可能。不要骗API,你不知道它们是如何工作的,或者如果你这样做,它们可以改变。这是重点。你没有说它是如何崩溃的,但也许这是一个访问冲突。我不知道为什么肯定,但我可以推测一种可能性。也许ReadFile读入一个中间缓冲区(或缓冲区)而不是直接读入你的(有很多原因可能会这样做),以后可能会将dword大小的副本重新放回缓冲区。它仍将返回正确的读取字节数,但最终可能会将一些“额外”复制到缓冲区中。只要您告诉ReadFile缓冲区的大小正确,就可以了。
说实话。
答案 1 :(得分:0)
好吧,我怀疑只是调用ReadFile
会导致程序崩溃。假设Windows Readfile功能,让我引用documentation:
如果ReadFile函数尝试读取文件末尾,则函数返回零,GetLastError返回ERROR_HANDLE_EOF。
您是否正在处理此错误或未经检查而继续?