WriteFileEx 不调用完成例程的修复方法是什么?

What is a fix for WriteFileEx not calling the completion routine?

提问人:ElSnowman 提问时间:6/2/2023 更新时间:6/2/2023 访问量:47

问:

背景:我有一个 HID 设备,我正在从我的 DLL 写入该设备。我的 DLL 由 DirectInput 加载,并在函数调用中接收数据。我将其中一些数据发送到我的设备。使用 ,游戏可能由于同步写入而陷入困境(当我不执行写入时它运行良好)。WriteFile

问题:在尝试对我的 HID 设备进行异步写入操作时,我使用了 .我遇到了一个问题,即我的完成例程没有被调用,所以我无法释放我在调用之前动态分配的结构。WriteFileExOVERLAPPEDWriteFileEX

法典:

my_hid = CreateFile(reinterpret_cast<DIHIDFFINITINFO*>(initialization_information)->pwszDeviceInterface, 
                   GENERIC_READ | GENERIC_WRITE, 
                   FILE_SHARE_READ | FILE_SHARE_WRITE, 
                   NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
LPOVERLAPPED over = new OVERLAPPED{ 0 };
BOOL success = WriteFileEx(my_hid, effect_report, EFFECT_REPORT_SIZE, over, (LPOVERLAPPED_COMPLETION_ROUTINE)completion_routine);
VOID WINAPI completion_routine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped)
{
  delete lpOverlapped;
}

笔记:

  • 数据仍在发送中。由我的 HID 设备接收。
  • WriteFileEx返回非零
  • GetLastError返回零
  • 为简洁起见,示例中未显示缓冲区分配或解除分配。
Windows IO 写入文件

评论

0赞 Ben Voigt 6/2/2023
使用异步 API 的操作有时仍可以同步完成。应该去区分。ERROR_IO_PENDING
0赞 Ben Voigt 6/2/2023
另外,您是否使用可警报的等待?“指向在写入操作完成且调用线程处于可警报等待状态时调用的完成例程的指针。”
0赞 Ben Voigt 6/2/2023
同样重要的是:“如果 OVERLAPPED 结构的 hEvent 成员为 NULL,则系统使用 hFile 句柄的状态在操作完成时发出信号。不建议将文件、命名管道或通信设备句柄用于此目的。使用事件对象更安全,因为在同一文件、命名管道或通信设备上同时执行多个重叠操作时可能会发生混淆。在这种情况下,无法知道是哪个操作导致了对象的状态被发出信号。

答: 暂无答案