是否可以将成员函数传递给 QueueUserAPC

Is it possible to pass a member function to QueueUserAPC?

本文关键字:QueueUserAPC 函数 成员 是否      更新时间:2023-10-16

是否有可能或解决方法将成员函数传递给Windows API函数QueueUserAPC()?

好的,我可以传递一个静态成员函数。但是这样我将无法完全访问局部成员变量...

那么是否有可能将两者结合起来,作为成员函数传递并完全访问非静态成员变量?我试图制定与此相关的解决方案,但尚未成功。

希望有人有解决这个问题的想法。

这是在

让 C 样式回调调用C++函数时使用的一种标准模式。

您创建一个转发调用的自由函数(或静态成员)...

VOID CALLBACK ForwardTo_MyClass_func( _In_  ULONG_PTR dwParam )
{
    auto* p = (MyClass*)dwParam;
    p->func();
}

。然后通过将实例指针作为第三个参数传递给 QueueUserAPC 来设置它:

QueueUserAPC( ForwardToMyClass_func, hThread, (ULONG_PTR)pMyClass );

如果需要更多参数,则必须创建某种结构来保存实例指针和参数。

答案是否定的。Windows API具有C接口,因此无法处理名称损坏的签名,例如C++成员函数。您传递的函数必须是 C 样式的自由函数。

顺便说一下,将其嵌套在命名空间中是可以接受的,如果可扩展性较低:

namespace apc_stuff
{
    static MyStruct some_static_data;
    static void __stdcall MyApcFunc(ULONG_PTR data); // PAPCFUNC
};
using namespace apc_stuff;
MyClass::DoSomething(...)
{
    auto my_data = new MyData(...);
    auto data = reinterpret_cast<ULONG_PTR>(my_data);
    QueueUserAPC(MyApcFunc, hThread, data)
}
/*static*/ void __stdcall apc_stuff::MyApcFunc(ULONG_PTR data)
{
    auto my_data = reinterpret_cast<MyData *>(data);
    // 
    // use my_data
    // use some_static_data
    // 
}