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

时间:2009-06-02 16:22:56

标签: 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
);

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

3 个答案:

答案 0 :(得分:5)

传入ReadFileEx的lpOverlapped函数被传递给lpCompletionRoutine函数。

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

struct ReadFileExContext
{ 
    OVERLAPPED _Overlapped; 
    LPVOID MyContext; 
}; 

然后在你的回调函数中,你将LPOVERLAPPED转换为ReadFileContext,你就可以了。

答案 1 :(得分:2)

今天正在做一些IO工作,并注意到在WSA和文件读/写函数中,声明如果你使用完成例程,例如,不使用OVERLAPPED结构的hEvent。来自ReadFileEx

  

ReadFileEx函数忽略OVERLAPPED结构的hEvent成员。应用程序可以在ReadFileEx调用的上下文中将该成员用于其自身目的。 ReadFileEx通过调用或排队调用lpCompletionRoutine指向的完成例程来指示其读操作的完成,因此它不需要事件句柄。

答案 2 :(得分:-1)

您可以使用Thread Local Storage ...只需创建一个插槽并存储指向您想要的任何数据的指针。由于lpCompletionRoutine在调用线程上运行,你应该没问题。