[英]Is it possible to pass a member function to 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
//
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.