1

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

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

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

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

4

2 回答 2

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 );

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

于 2013-11-03T17:54:56.890 回答
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
    // 
}
于 2017-06-14T11:50:17.790 回答