2013-11-03 83 views
1

是否存在將成員函數傳遞給Windows API函數QueueUserAPC()的可能性或解決方法?是否有可能將成員函數傳遞給QueueUserAPC?

好的,我可以傳遞一個靜態成員函數。 但是,我不會有完全訪問本地成員變量...

那麼是否有可能結合二者,作爲成員函數傳遞和完全訪問非靜態成員變量? 我試圖找出與this相關的解決方案,但是還沒有成功。

希望有人有一個想法來解決這個問題。

回答

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); 

如果您需要更多參數,您將不得不創建某種結構來保存實例指針和參數。

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 
    // 
} 
相關問題