2013-11-03 74 views
1

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

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

那么是否有可能结合二者,作为成员函数传递和完全访问非静态成员变量? 我试图找出与this相关的解决方案,但是还没有成功。

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

回答

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

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

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 
    // 
} 
相关问题