是否有可能或解决方法将成员函数传递给 Windows API 函数 QueueUserAPC()?
好的,我可以传递一个静态成员函数。但是我将无法完全访问本地成员变量......
那么是否有可能将两者结合起来,作为成员函数传递和对非静态成员变量的完全访问?我试图制定与此相关的解决方案,但尚未取得任何成功。
希望有人有一个想法来解决这个问题。
是否有可能或解决方法将成员函数传递给 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
//
}