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
dankt, es funktioniert !!! –
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; ' –
@ 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