我正在尝试通过USB隐藏与设备通信。在某些时候,我想使用winapi从设备读取数据。我首先创建文件
HidDeviceObject = CreateFile (
(LPCTSTR)DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, //&SecurityAttributes,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
这部分似乎已经过测试。然后在初始化我的应用程序时创建一个线程。线程看起来像这样
int result;
BOOL fWaitingOnRead = FALSE;
while(TRUE)
{
if(!write)
{
if (HidDeviceObject != INVALID_HANDLE_VALUE)
{
HIDOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
result = ReadFile(HidDeviceObject, &InputReport, Capabilities.InputReportByteLength, &NumberOfBytesRead, &HIDOverlapped);
if (GetLastError() != ERROR_IO_PENDING)
// Error
else
fWaitingOnRead = TRUE;
if(fWaitingOnRead)
DWORD dwRes = WaitForSingleObject(HIDOverlapped.hEvent, INFINITE);
}
}
}
该代码在知道有周期性数据来自我的其他USB设备的情况下执行。但是问题是WaitForSingleObject不返回。当然,通过使用例如500ms的值代替INFINITE可以使我获得超时代码。那么,此行为的原因是什么。谢谢
答案 0 :(得分:0)
您正在寻找GetOverlappedResult
而不是WaitForSingleObject
。不要挑选事件,请使用整个OVERLAPPED
对象。
GetOverlappedResultEx
接受一个tiemout值,如果您再次需要500毫秒。