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

时间:2013-11-03 17:43:51

标签: c++ callback member-functions

是否有可能将成员函数传递给Windows API函数QueueUserAPC()?

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

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

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

2 个答案:

答案 0 :(得分:3)

这是一种在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 );

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

答案 1 :(得分:0)

答案是否定的。 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
    // 
}
相关问题