2013-03-28 5 views
5

विनमेन एक ऐसा फ़ंक्शन है जो डिफ़ॉल्ट मुख्य प्रविष्टि बिंदु 'मुख्य' को 'प्रतिस्थापित करता है'।सी ++: कस्टम मुख्य फ़ंक्शन लागू करें

उपयोगकर्ता तो

int WINAPI WinMain(...) { } 


की तरह अपने मुख्य प्रवेश बिंदु कैसे कैप्सूलीकरण इस तरह से किया जाता है परिभाषित कर सकते हैं?

ठीक है, सबसे अधिक संभावना है, कुछ बिंदु पर यह इस तरह दिखता है:

int main() // This must be defined somewhere in windows.h 
{ 
    return WinMain(...); 
} 

प्रश्न: मैं स्वयं इस तरह के एक कैप्सूलीकरण, जो तब WinMain कॉल कैसे पूरा कर सकते हैं? नोट: पुस्तकालय जो मैं बना एक DLL है, इसलिए यह इस तरह दिखेगा:

// This is the minimal code for the application which uses 'MyLibrary' 
#pragma comment(lib, "MyLibrary.lib") 
include "MyLibrary.h" 

void Main(MyCustomParameter *params) 
{ 
    // Write user code here 
} 

समस्या तथापि है, कि DLL नहीं है 'पता' Main() कार्य है और इसलिए एक 'अनसुलझे फेंकता बाहरी प्रतीक 'संकलन त्रुटि। तो मैं इसे इस तरह कैसे समाहित कर सकता हूं?

उत्तर

3

आप अपने कस्टम मुख्य कार्य के हस्ताक्षर पर फैसला और (सी की ++ मामले में निर्वासन 'सी') के रूप में "extern" यह घोषित करने के लिए है। फिर, एप्लिकेशन कोड को उस फ़ंक्शन को परिभाषित करना होगा और अपनी स्थिर लाइब्रेरी के विरुद्ध लिंक होना चाहिए जिसमें वास्तविक _main एंट्री पॉइंट है। उदाहरण के लिए:

extern "C" int my_main(int argc, char *argv[]); 

int main(int argc, char *argv[]) 
{ 
    return my_main(argc, argv); 
} 
+0

मुझे अभी भी 'बाहरी "सी के साथ एक अनसुलझा बाहरी मिलता है। क्या ऐसा इसलिए है क्योंकि मैं WinMain का उपयोग मुख्य की बजाय आंतरिक प्रविष्टि बिंदु के रूप में करता हूं? – bytecode77

+0

@ डेविल्स चाइल्ड: यह कहना मुश्किल है कि आप क्या करते हैं। यदि आपका प्रवेश बिंदु 'WinMain' है -' WinMain' से अपना मुख्य कॉल करें। यदि यह केवल 'मुख्य() 'है - इसे' मुख्य()' से कॉल करें। पहले w/o परिवर्तनों को संकलित करने के लिए अपना कोड प्राप्त करें, फिर परिवर्तन करें और देखें कि क्या ब्रेक। या कम से कम एक न्यूनतम पूर्ण उदाहरण डालें जो आपकी समस्या का प्रदर्शन करता है ... अन्यथा जो भी आप कर रहे हैं उसे डीबग करना मुश्किल है। –

+0

जाहिर है, यह संरचना शामिल करने में एक समस्या है। मैंने यहां कुछ बहुत ही सरल कोड डाला है: http://dev-ch.com/files/a8dce463-65a2-54fe-ef43-c9d4160dea95/mylibrarywithcustommain.zip जब मैं 'exampleClass.h' शामिल नहीं करता हूं तो यह काम करता है। – bytecode77

2

लिंकर डिफ़ॉल्ट प्रविष्टि बिंदु नाम "मुख्य" है। आप जो भी फ़ंक्शन चाहते हैं उसके साथ शुरू करने के लिए डिफ़ॉल्ट को ओवरराइड कर सकते हैं।

/ENTRY (Entry-Point Symbol)

2

दरअसल, असली प्रविष्टि बिंदु न तो मुख्य और न ही WinMain है। असली प्रविष्टि बिंदु WWinMainCRTStartup, WinMainCRTStartup, wmainCRTStartup, और mainCRTStartup में से एक है। लेकिन वे Windows.h में परिभाषित नहीं हैं, वे सीआरटी का हिस्सा हैं। आप <VS installation folder> \ VC \ crt \ src \ crtexe.c में अपना कोड देख सकते हैं। वे प्रत्येक कुछ प्रारंभिक कार्य करते हैं और फिर क्रमशः WWinMain, WinMain, Wmain, और मुख्य में से एक को कॉल करते हैं।

जैसा कि किसी और ने बताया है, आप एंट्री पॉइंट को/एंट्री स्विच के साथ ओवरराइड कर सकते हैं, लेकिन आपके पास अभी भी कस्टम पैरामीटर नहीं हो सकते हैं, यही कारण है कि आप इसे पहले स्थान पर करना चाहते हैं।

+0

मुझे मुख्यCRTStartup चीज़ के बारे में पता था, लेकिन मैं वास्तव में कस्टम पैरामीटर का उपयोग कर सकता हूं। मेरा प्रयास यहां है: http://dev-ch.com/files/a8dce463-65a2-54fe-ef43-c9d4160dea95/mylibrarywithcustommain.zip कुछ अज्ञात समस्याओं के कारण यह काम नहीं करता है, लेकिन जब आप 'exampleClass को हटाते हैं 'एस, आप देखेंगे कि यह काम करता है। शेष समस्या अब शामिल संरचना है जो अभी तक काम नहीं करती है। – bytecode77

संबंधित मुद्दे