C++ 使用重叠结构进行回调?

C++ 使用重叠结构进行回调?,c++,windows,asynchronous,overlapped-io,io-completion-ports,C++,Windows,Asynchronous,Overlapped Io,Io Completion Ports,对于使用IO完成端口的异步IO,我有自己的重叠结构 现在我收到了读/写完成的通知。我可以在重叠结构中作为参数传递回调函数吗 这将允许我根据传递的重叠结构类型指定各种回调函数 有人有幸做到这一点吗?创建您自己的结构,该结构派生自重叠的: struct MyOverlapped : OVERLAPPED { CALLBACK MyCallback; }; 现在改用这个: MyOverlapped *o=new MyOverlapped; o->MyCallback=CallbackHan

对于使用IO完成端口的异步IO,我有自己的重叠结构

现在我收到了读/写完成的通知。我可以在重叠结构中作为参数传递回调函数吗

这将允许我根据传递的重叠结构类型指定各种回调函数


有人有幸做到这一点吗?

创建您自己的结构,该结构派生自重叠的

struct MyOverlapped : OVERLAPPED
{
  CALLBACK MyCallback;
};
现在改用这个:

MyOverlapped *o=new MyOverlapped;
o->MyCallback=CallbackHandler;

WriteFile(..,..,MyOverlapped);
然后,当您获得重叠的
时,您可以将其转换为衍生版本:

MyOverlapped *o=static_cast<MyOverlapped*>(overlapped);
MyOverlapped*o=静态_铸造(重叠);

现在您可以访问回调。我猜您正在通过调用
GetQueuedCompletionStatus
返回
OVERLAPPED
实例,您返回的指针将实际指向您的派生结构。

创建您自己的派生自
OVERLAPPED
的结构:

struct MyOverlapped : OVERLAPPED
{
  CALLBACK MyCallback;
};
现在改用这个:

MyOverlapped *o=new MyOverlapped;
o->MyCallback=CallbackHandler;

WriteFile(..,..,MyOverlapped);
然后,当您获得重叠的
时,您可以将其转换为衍生版本:

MyOverlapped *o=static_cast<MyOverlapped*>(overlapped);
MyOverlapped*o=静态_铸造(重叠);
现在您可以访问回调。我猜您从调用
GetQueuedCompletionStatus
返回了
OVERLAPPED
实例,您返回的指针实际上将指向您的派生结构。

重叠结构几乎总是扩展到包括实现定义的数据。我看不出有什么理由不能在其中填充回调函数指针。但是请注意,GetQueueCompletionStatus循环通常足够复杂,将底层数据推送到CB可能不会给您带来太多好处(但我可以肯定地看到它如何消除循环中的
开关
或跳转表取消引用)。重叠结构几乎总是扩展到包括实现定义的数据。我看不出有什么理由不能在其中填充回调函数指针。但是请注意,GetQueueCompletionStatus循环通常足够复杂,将底层数据推送到CB可能不会给您带来太多好处(但我可以肯定地看到它如何消除循环中的
开关或跳转表取消引用)。