是否存在將成員函數傳遞給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
//
}