MSDN文章理解: 實現回呼函數
1. BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)表示此函數需要回呼函數的線索之一是存在lpEnumFunc參數.如果參數採用指向回呼函數的指標,其名稱中通常會有lp(長指標)首碼與Func尾碼的結合 2
2.建立託管回呼函數.該執行個體聲明一個名為Callback 委託類型,此委託類型採用兩個參數: hwnd和lparam. 第一個參數是視窗的控制代碼;第二個參數由應用程式定義. 回呼函數通常返回非零值表示成功,非零值表示失敗
3 建立一個委託,並將其作為參數傳遞給 EnumWindows 函數。平台叫用會自動將委託轉換為常見的回調格式。
4 確保在回呼函數完成其工作之前,記憶體回收行程不會回收委託。如果委託作為參數進行傳遞,或者所包含的委託作為結構中的欄位進行傳遞,則該委託在調用期間不會被回收。因此,正如下面的枚舉樣本所示,回呼函數會在調用返回前完成其工作,而無需託管調用方執行額外的操作。 然而,如果可以在調用返回後調用回呼函數,則託管調用方必須採取相應的措施來確保委託在回呼函數完成其工作之前不會被回收。
// A delegate type.
__delegate bool CallBack(int hwnd, int lParam);
// Managed type with the method to call.
__gc class EnumReport
{
// Report the window handle.
public:
bool Report(int hwnd, int lParam) {
Console::Write(L"Window handle is ");
Console::WriteLine(hwnd);
return true;
}
};
[DllImport("user32")]
extern "C" int EnumWindows(CallBack* x, int y);
void main(void) {
EnumReport* er = new EnumReport;
CallBack* myCallBack = new CallBack(er, &EnumReport::Report);
EnumWindows(myCallBack, 0);
}