2012-05-10 3 views
5

Wenn ich versuche, die folgend auf MinGW 4.6.2EnumChildWindows und Lambda

EnumChildWindows(hwnd, [](HWND, LPARAM) -> BOOL { return TRUE; }, 0); 

I

error: cannot convert '<lambda(HWND, LPARAM)>' 
to 'ENUMWINDOWSPROC {aka int (*)(HWND__*,long int)}' 
for argument '2' to 'BOOL EnumChildWindows(HWND, ENUMWINDOWSPROC, LPARAM)' 

zu kompilieren Bin ich das Lambda falsch erklärt, oder ist dies einfach nicht zur Arbeit gehen? Die MS Definition des Callback ist

BOOL CALLBACK EnumChildProc(
    __in HWND hwnd, 
    __in LPARAM lParam 
); 

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633493%28v=vs.85%29.aspx

Ist die Aufrufkonvention das Problem verursacht?

+0

http://stackoverflow.com/questions/2935201/will-c0x-support-stdcall-oder-extern-c-capture-nothing-lambdas ist verwandt. –

Antwort

6

BOOL RUECKRUF EnumChildProc (...)

, dass das Problem ist, gilt das RUECKRUF Makro das __stdcall-Attribut auf die Funktion, um die Aufrufkonvention von der Standardeinstellung zu ändern. Was in den meisten Programmen __cdecl ist. Sie können die Aufrufkonvention für Ihr Lambda nicht steuern, indem Sie die globale Einstellung ändern (Option/Gz kompilieren). Das kann viel mehr Nebenwirkungen haben als Sie sich interessieren, geben Sie diese Lamda auf.

Kein Problem in 64-Bit-Code BTW.

+1

@luksy: Beachten Sie auch, dass VC++ 11 dies für Sie implizit behandelt (d. H. Es funktioniert einfach). – ildjarn