2013-01-05 10 views
15

Desidero passare un puntatore a funzione lambda, che è annidato in una classe, alla funzione di callback dell'API di Windows. Ho trovato che non c'è posto per me per specificare la parola chiave __stdcall. Alcune persone mi hanno detto che la compilazione supporta solo __cdecl, ma dopo aver usato il comando nm per scaricare il file obj, ho trovato che la compilazione genererà tre funzioni di supporto (__stdcall, __cdecl, __fastcall) contemporaneamente. Quindi il mio problema è, come posso specificare la convenzione di chiamata?come specificare la convenzione di chiamata lambda vc11

I seguenti codici sono il mio codice di prova.

#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 

risposta

13

gettalo via:

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

o riporla in una variabile locale prima:

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

sinceramente grazie, funziona !!! –

+1

E ora ho incontrato un altro problema: quando uso questa sintassi, non posso catturare nessuna variabile, come questa: 'auto func = [this]() {}; void (__stdcall * funcp)() = func; ' –

+2

@ user1948596: Non è del tutto estraneo alle convenzioni di chiamata - solo _captureless_ lambda sono convertibili in puntatori di funzione (in quale altro modo si potrebbe mantenere lo stato?). Le funzioni WinAPI che accettano i callback hanno sempre anche un parametro di stato 'void *'/'LPVOID'; usa questo argomento per passare 'this' (' static_cast' ancora una volta). – ildjarn

Problemi correlati