如何为ReadFileEx()的完成例程提供上下文信息?

Gil*_*ili 3 windows file-io asynchronous

Win32 ReadFileEx定义为:

BOOL WINAPI ReadFileEx(
  __in       HANDLE hFile,
  __out_opt  LPVOID lpBuffer,
  __in       DWORD nNumberOfBytesToRead,
  __inout    LPOVERLAPPED lpOverlapped,
  __in_opt   LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚如何使完成例程(最后一个参数)在操作完成时调用动态函数指针。似乎没有传递用户数据的方法。有任何想法吗?

Rei*_*man 6

传递给ReadFileEx的lpOverlapped函数将传递给lpCompletionRoutine函数。

您可以将lpOverlapped嵌入您自己的结构中,然后使用它来查找指向上下文的指针:

struct ReadFileExContext
{ 
    OVERLAPPED _Overlapped; 
    LPVOID MyContext; 
}; 
Run Code Online (Sandbox Code Playgroud)

然后,在回调函数中,将LPOVERLAPPED强制转换为ReadFileContext,您就可以开始了。

  • 所以... hackish ...必须...抵抗...假设没有更好的方法可以做到,实际上您的方法似乎比使用TLS更简单(这在C ++中又是一团糟)。谢谢 :) (2认同)
  • 我刚刚找到了一篇很好的文章,讨论了这种方法:http://int64.org/2009/05/14/io-completion-ports-made-easy (2认同)