2009-06-02 66 views
1

的Win32 ReadFileEx被定义为:如何为上下文信息提供ReadFileEx()的完成例程?

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

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

回答

3

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

你可以在你自己的结构嵌入lpOverlapped的,然后用它来找到指向您的上下文:

struct ReadFileExContext 
{ 
    OVERLAPPED _Overlapped; 
    LPVOID MyContext; 
}; 

然后在你的回调函数,你投的LPOVERLAPPED到ReadFileContext,你是好走。

+1

所以...... hackish ......必须......抵制......假设没有更好的方法来做到这一点,你的方法似乎比使用TLS(这在C++中又是一团糟)更简单。谢谢:) – Gili 2009-06-02 19:47:31

-1

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

1

当前正在做一些IO工作,并且在WSA和File读/写功能中注意到,如果您正在使用完成例程,则不会使用OVERLAPPED结构的事件。 from ReadFileEx

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

相关问题