2013-01-05 21 views
15

मैं एक लम्बा फ़ंक्शन पॉइंटर पास करना चाहता हूं, जो क्लास में घोंसला हुआ है, विंडोज एपीआई कॉलबैक फ़ंक्शन में। मैंने पाया कि __stdcall कीवर्ड निर्दिष्ट करने के लिए मेरे पास कोई जगह नहीं है। कुछ लोगों ने मुझे बताया संकलन केवल __cdecl समर्थन करते हैं, लेकिन बाद मैं एनएम आदेश इस्तेमाल किया obj फ़ाइल डंप करने के लिए, मैंने पाया संकलन तीन सहायक समारोह (__stdcall, __cdecl, __fastcall) समवर्ती उत्पन्न होगा। तो मेरी समस्या यह है कि मैं कॉलिंग सम्मेलन को कैसे निर्दिष्ट कर सकता हूं?vc11 lambda कॉलिंग सम्मेलन को निर्दिष्ट करने के लिए कैसे करें

निम्नलिखित कोड मेरे परीक्षण कोड हैं।

#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 

उत्तर

13

कास्ट यह:

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

या पहले एक स्थानीय चर में संग्रहीत:

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

ईमानदारी से धन्यवाद, यह काम करता है !!! –

+1

और अब मैं एक और समस्या को पूरा करता हूं: जब मैं इस वाक्यविन्यास का उपयोग करता हूं, तो मैं इस तरह के किसी भी चर को नहीं पकड़ सकता: 'auto func = [this]() {}; शून्य (__stdcall * funcp)() = func; ' –

+2

@ user1948596: यह सम्मेलनों को कॉल करने के लिए पूरी तरह से असंबंधित है - केवल _captureless_ lambdas फ़ंक्शन पॉइंटर्स में परिवर्तनीय हैं (राज्य को और कैसे बनाए रखा जा सकता है?)। WinAPI फ़ंक्शन जो कॉलबैक लेते हैं, उनके पास हमेशा 'शून्य * '/' LPVOID' राज्य पैरामीटर होता है; 'this' (' static_cast' फिर से) पास करने के लिए उस तर्क का उपयोग करें। – ildjarn