Win32 ReadFileEx
定义为:
BOOL WINAPI ReadFileEx(
__in HANDLE hFile,
__out_opt LPVOID lpBuffer,
__in DWORD nNumberOfBytesToRead,
__inout LPOVERLAPPED lpOverlapped,
__in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
我试图弄清楚当操作完成时如何使完成例程(最后一个参数)调用动态函数指针。似乎没有办法传递用户数据。有什么想法吗?
答案 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在调用线程上运行,你应该没问题。