Bir sınıfta iç içe geçmiş bir lambda işlev işaretçisini Windows API geri arama işlevine iletmek istiyorum. __stdcall
anahtar kelimesini belirtmek için yer yok. Bazı insanlar derlemenin yalnızca __cdecl
desteğini söylediler, ancak obj dosyasını dökmek için nm komutunu kullandıktan sonra, derlemenin eş zamanlı olarak üç yardımcı işlev (__stdcall
, __stdcall
, __cdecl
, __fastcall
) üreteceğini buldum. Yani benim sorunum, çağrı düzenini nasıl belirleyebilirim?vc11 lambda çağrı kuralı nasıl belirlenir
Aşağıdaki kodlar benim test kodum.
#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
sayesinde, bu işi yapar !!! –
Ve şimdi başka bir sorunla karşılaşıyorum: Bu sözdizimini kullandığımda, aşağıdaki gibi herhangi bir değişken yakalayamıyorum: 'auto func = [this]() {}; void (__stdcall * funcp)() = func; ' –
@ user1948596: Bu sadece çağrıları çağrıştırmakla alakasız - sadece _captureless_ lambdas işlev göstergelerine dönüştürülebilir (başka nasıl durum korunabilir?). Geri çağrıları alan WinAPI işlevleri her zaman bir 'void *'/'LPVOID' durumu parametresine sahiptir; Bu argümanı kullanmak için 'this' ('static_cast 'henüz tekrar). – ildjarn