2011-08-09 50 views
1

我收到了一個奇怪的錯誤,試圖將EnumWindows添加到類中的函數中。這裏是我的代碼EnumWindows指針錯誤

EnumWindows(&ConsoleDetector::EnumWindowsProc, NULL); 

BOOL CALLBACK ConsoleDetector::EnumWindowsProc(HWND wnd, LPARAM lParam) 
{ 
    char className[200]; 
    GetClassName(wnd, className, 200); 
    if (strcmp(className, "ConsoleWindowClass")) 
     m_result.push_back(wnd); 
    return TRUE; 
} 

這裏的錯誤即時得到:

ConsoleDetector.cpp:30: error: cannot convert 'BOOL (ConsoleDetector::*)(HWND__*, LPARAM)' to 'BOOL (*)(HWND__*, LPARAM)' for argument '1' to 'BOOL EnumWindows(BOOL (*)(HWND__*, LPARAM), LPARAM)' 

使用MingW平臺。 感謝您的幫助。

回答

4

您正在傳遞一個實例方法。您需要傳遞一個普通函數而不是綁定到實例的方法。

它必須聲明如下:

BOOL CALLBACK EnumWindowsProc(HWND wnd, LPARAM lParam) 

傳遞ConsoleDetector的實例的EnumWindowslParam參數,它會反過來被傳遞給你的回調。

像這樣:

BOOL CALLBACK EnumWindowsProc(HWND wnd, LPARAM lParam) 
{ 
    ConsoleDetector cd = static_cast<ConsoleDetector*>(lParam); 
    //do stuff with cd and wnd 
} 

ConsoleDetector *cd = ... 
EnumWindows(EnumWindowsProc, static_cast<LPARAM>(cd)); 
+0

我找到了一個方法,我通過我的向量作爲LPARAM。感謝您的幫助。 – SBSTP

+0

這相當於我上面寫的。 –

2

不能使用類成員函數的窗口回調函數在C++中。只允許靜態類函數或非類函數。

EnumWindows函數應該如何處理類的實例?您只能提供函數指針,而不是指向EnumWindows的實例指針