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