是否存在将成员函数传递给Windows API函数QueueUserAPC()的可能性或解决方法?是否有可能将成员函数传递给QueueUserAPC?
好的,我可以传递一个静态成员函数。 但是,我不会有完全访问本地成员变量...
那么是否有可能结合二者,作为成员函数传递和完全访问非静态成员变量? 我试图找出与this相关的解决方案,但是还没有成功。
希望有人有一个想法来解决这个问题。
是否存在将成员函数传递给Windows API函数QueueUserAPC()的可能性或解决方法?是否有可能将成员函数传递给QueueUserAPC?
好的,我可以传递一个静态成员函数。 但是,我不会有完全访问本地成员变量...
那么是否有可能结合二者,作为成员函数传递和完全访问非静态成员变量? 我试图找出与this相关的解决方案,但是还没有成功。
希望有人有一个想法来解决这个问题。
这是一种标准模式,在使用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
//
}