2013-01-05 8 views
15

Ich möchte einen Lambda-Funktionszeiger, der in einer Klasse geschachtelt ist, an die Windows-API-Callback-Funktion übergeben. Ich habe festgestellt, dass es keinen Platz für mich gibt, das Schlüsselwort __stdcall anzugeben. Einige Leute sagten mir, dass die Kompilierung nur Unterstützung __cdecl, aber nachdem ich nm-Befehl verwendet, um die Obj-Datei auszugeben, fand ich die Kompilierung wird drei Hilfsfunktion (__stdcall, __cdecl, __fastcall) gleichzeitig generieren. Also mein Problem ist, wie kann ich die Aufrufkonvention angeben?wie vc11 lambda Aufrufkonvention angeben

Die folgenden Code sind mein Testcode.

#include "stdafx.h" 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    auto func = [](){}; 
    return 0; 
} 
00000000 t ?<helper_func_cdecl>@<lambda_5738939ec88434c53e1a446c47cf2db6>@@CAXXZ 
00000000 t ?<helper_func_fastcall>@<lambda_5738939ec88434c53e1a446c47cf2db6>@@CIXXZ 
00000000 t ?<helper_func_stdcall>@<lambda_5738939ec88434c53e1a446c47cf2db6>@@CGXXZ 
00000000 t ??B<lambda_5738939ec88434c53e1a446c47cf2db6>@@QBEP6AXXZXZ 
00000000 t ??B<lambda_5738939ec88434c53e1a446c47cf2db6>@@QBEP6GXXZXZ 
00000000 t ??B<lambda_5738939ec88434c53e1a446c47cf2db6>@@QBEP6IXXZXZ 
00000000 t ??R<lambda_5738939ec88434c53e1a446c47cf2db6>@@QBEXXZ 

Antwort

13

Guss es:

WinApiFunc(static_cast<void(__stdcall *)()>(func)); 

oder lagern Sie es in eine lokale Variable zuerst:

void (__stdcall *funcp)() = func; 
WinApiFunc(funcp); 
+0

dankt, es funktioniert !!! –

+1

Und jetzt stoße ich auf ein anderes Problem: Wenn ich diese Syntax verwende, kann ich keine Variablen wie folgt abfangen: 'auto func = [this]() {}; void (__stdcall * funcp)() = func; ' –

+2

@ user1948596: Das hat nichts mit Aufrufkonventionen zu tun - nur _captureless_ lambdas sind in Funktionszeiger umwandelbar (wie könnte sonst der Zustand beibehalten werden?). WinAPI-Funktionen, die Rückrufe entgegennehmen, haben immer auch einen 'void *'/'LPVOID'-Zustandsparameter; Verwenden Sie dieses Argument, um 'this' (' static_cast' noch einmal zu übergeben). – ildjarn

Verwandte Themen