2008-09-24 11 views
18

मुझे निष्पादन योग्य नाम के आधार पर किसी एप्लिकेशन की कार्यक्षमता को बदलने की आवश्यकता है। कुछ भी बड़ा नहीं, केवल तारों को बदल रहा है और कुछ आंतरिक पहचानकर्ता हैं। आवेदन देशी और नेट सी ++ - सीएलआई कोड के मिश्रण में लिखा गया है।विंडोजसी ++/सीएलआई में एप्लिकेशन निष्पादन योग्य नाम कैसे प्राप्त करें?

मैंने जिस तरीके से देखा है, Win32 में GetCommandLine() फ़ंक्शन को पार्स करना और ऐपडोमेन और अन्य चीज़ों के साथ भरना है। नेट। हालांकि GetCommandLine का उपयोग हमेशा डीबगर से चलाने के दौरान काम नहीं करेगा, कमांड लाइन खाली है। और .Net AppDomain सामान को बहुत सारी चीज़ें भरने की आवश्यकता होती है।

तो सी ++/सीएलआई में निष्पादन योग्य नाम निर्धारित करने का सबसे अच्छा/सरल/सबसे प्रभावी तरीका क्या है? (मुझे उम्मीद है कि मैंने कुछ आसान पाया है जो नेट में उपलब्ध है।

संपादित करें: मुझे एक बात का जिक्र करना चाहिए कि यह सी ++/सीएलआई का उपयोग कर एक विंडोज जीयूआई एप्लीकेशन है, इसलिए वहां है पारंपरिक सी शैली मुख्य समारोह तक कोई पहुंच नहीं है, यह विंडोज WinMain() फ़ंक्शन का उपयोग करता है।

उत्तर

35

GetModuleFileName() को मॉड्यूल हैंडल के रूप में 0 का उपयोग करके कॉल करें।

नोट: आप मुख्य रूप से argv [0] पैरामीटर का उपयोग कर सकते हैं या GetCommandLine() को कॉल करते हैं तो कोई मुख्य नहीं है। हालांकि, ध्यान रखें कि ये विधियां आपको निष्पादन योग्य फ़ाइल के लिए आवश्यक पथ नहीं देगी। वे कार्यक्रमों को शुरू करने के लिए इस्तेमाल किए गए पात्रों की एक ही स्ट्रिंग वापस दे देंगे। GetModuleFileName() को कॉल करना हमेशा आपको एक पूर्ण पथ & फ़ाइल नाम देगा।

8

main को argv तर्क का उपयोग करें:

int main(int argc, char* argv[]) 
{ 
    printf("%s\n", argv[0]); //argv[0] will contain the name of the app. 
    return 0; 
} 

आप स्ट्रिंग स्कैन करने के लिए निर्देशिका जानकारी और/या एक्सटेंशन को हटाने के लिए आवश्यकता हो सकती है, लेकिन नाम नहीं होगा।

+0

यह समाधान पार मंच होने का अतिरिक्त लाभ दिया है। –

+0

हां यह करता है, हालांकि मैं एक क्रॉस प्लेटफार्म की तलाश नहीं कर रहा हूं, केवल Win32 या .Net का उपयोग कर विंडोज के लिए एक। – Daemin

+3

यह सामान्य मामले में काम नहीं करता है। – tml

3

असेंबली पर एक स्थिर विधि है जो इसे आपके लिए .NET में प्राप्त करेगी।

Assembly.GetEntryAssembly().FullName 

संपादित करें: मुझे नहीं पता था कि आप फ़ाइल नाम चाहता था ... आप भी प्राप्त कर सकते हैं कि फोन करके:

Assembly.GetEntryAssembly().CodeBase 

है कि आप विधानसभा के लिए पूरा पथ मिल जाएगा (सहित फ़ाइल का नाम)।

+0

हालांकि यह शुरुआत में जाने का तरीका प्रतीत होता था, यह वास्तव में अभ्यास में काम नहीं करता है, क्योंकि असेंबली नाम वही है जो निष्पादन योग्य नाम पर सेट हो जाता है। – Daemin

10

फेरुसियो का जवाब अच्छा है। यहाँ कुछ उदाहरण कोड है:

TCHAR exepath[MAX_PATH+1]; 

if(0 == GetModuleFileName(0, exepath, MAX_PATH+1)) 
    MessageBox(_T("Error!")); 

MessageBox(exepath, _T("My executable name")); 
+2

msdn से: 'यदि फ़ंक्शन विफल हो जाता है, तो वापसी मान 0 (शून्य) 'है हाँ ... आप अपने सशर्त बयान में' !=' के बजाय '==' का उपयोग करना चाह सकते हैं –

4

उपयोग __argv [0]

+0

सबसे सरल और सबसे अच्छा जवाब । – Benio

+0

केवल तभी कार्यक्रम 'मुख्य' या 'विनमेन' से शुरू हुआ, और 'wmain',' wWinMain' नहीं।यदि "डब्ल्यू" मुख्य प्रवेश बिंदु है, तो '__wargv' का उपयोग किया जाना चाहिए। अन्य "argv" शून्य रहेंगे। – Ajay

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