2013-01-05 27 views
15

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 

cevap

13

Oyuncular it:

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

Ya da ilk yerel bir değişkene saklayın:

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

sayesinde, bu işi yapar !!! –

+1

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; ' –

+2

@ 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