2010-02-27 7 views
11

मैं WinMain के cmdLine तर्क को argc और argv में कनवर्ट करना चाहता हूं, इसलिए मैं कंसोल अनुप्रयोगों के लिए लिखने वाले तर्क पार्सिंग फ़ंक्शन का उपयोग कर सकता हूं।पुरानी शैली मुख्य() के तर्कों में WinMain की cmdLine को तोड़ना

यह छोटा होगा, सिवाय इसके कि मैं भी "उद्धरण" का समर्थन करना चाहता हूं। उदाहरण के लिए:

test.exe test1 test2 "testing testing"

argv[0] = "test.exe"; argv[1] = "test1"; argv[2] = "test2"; argv[3] = "testing testing"; 

होना चाहिए मुझे एहसास है कि cmdLine में प्रोग्राम का नाम नहीं है (argv [0]); इससे कोई फर्क नहीं पड़ता कि मैं एक डमी मूल्य का उपयोग कर सकता हूं।

मैं इसे रेगेक्स के साथ करने की सोच रहा था, (("[^"]+")\s+)|(([^\s]+)\s*) मुझे यकीन नहीं है कि यह कितना अच्छा काम करेगा .. शायद बहुत अच्छा नहीं है? विंडोज एपीआई में ऐसा करने के लिए कोई काम है? धन्यवाद

उत्तर

5

CommandLineToArgvW ऐसा लगता है कि यह यहां सहायक होगा।

+1

बस देखना है कि 'CommandLineToArgvW' नहीं करता ' टी सरणी के अंत तक एक सेंटीनेल नल मान जोड़ें, इसलिए इसमें मानक सी – jamesdlin

+2

में 'argv' के समान अर्थशास्त्र नहीं है, इसके अतिरिक्त,' कमांडलाइन टीओए आरजीवीडब्ल्यू ग्लोब का विस्तार नहीं करेगा। यदि '__argc' /' __argv' अनुपलब्ध है, तो आपको इसके बजाय '__getmainargs' या' __wgetmainargs' का उपयोग करना चाहिए। –

+0

@ एंड्रयूमेडिको सी 8 9 के बाद से? भाषा मानक अनिवार्य है कि "argv [argc]' एक शून्य सूचक होगा "। हालांकि यह अनावश्यक जानकारी है, यह मानक व्यवहार है, इसलिए कुछ लोग उस पर भरोसा करते हैं। – jamesdlin

20

यदि आप माइक्रोसॉफ्ट कंपाइलर का उपयोग कर रहे हैं, तो , __argv और __wargvstdlib.h में परिभाषित सार्वजनिक प्रतीक हैं। यह मिनीजीडब्लू पर भी लागू होता है जो माइक्रोसॉफ्ट रनटाइम पुस्तकालयों का उपयोग करता है।

+5

+1। जब ये उपलब्ध होते हैं, तो मैं व्यक्तिगत रूप से 'कमांडलाइन टीओआरजीवीडब्लू' पर पसंद करता हूं क्योंकि आपको 'लोकलफ्री' को कॉल करने की आवश्यकता नहीं है और चूंकि '__argv [__ argc]' और '__wargv [__ argc] 'को' NULL' पर सेट किया गया है। – jamesdlin

+0

शानदार! लेकिन 'envp' के बारे में क्या? ** संपादित करें **: ठीक है, '_CRTIMP बाहरी चार ** वातावरण; 'चाल है, मुझे विश्वास है। – csl

1

यदि आप सादा int argc चाहते हैं, char ** argv तर्क आपको इसे स्वयं करना है।

void fetchCmdArgs(int* argc, char*** argv) { 
    // init results 
    *argc = 0; 

    // prepare extraction 
    char* winCmd = GetCommandLine(); 
    int index = 0; 
    bool newOption = true; 
    // use static so converted command line can be 
    // accessed from outside this function 
    static vector<char*> argVector; 

    // walk over the command line and convert it to argv 
    while(winCmd[index] != 0){ 
     if (winCmd[index] == ' ') { 
      // terminate option string 
      winCmd[index] = 0; 
      newOption = true; 

     } else { 
      if(newOption){ 
       argVector.push_back(&winCmd[index]); 
       (*argc)++; 
      } 
      newOption = false; 
     } 
     index++; 
    } 

    // elements inside the vector are guaranteed to be continous 
    *argv = &argVector[0]; 
} 


// usage 
int APIENTRY WinMain(...) { 
    int argc = 0; 
    char** argv; 
    fetchCmdArgs(&argc, &argv); 
} 
+1

-1 यह आपको यहां देखने से कहीं अधिक जटिल है। एक बात के लिए, आप कोटेशन को संभालने नहीं कर रहे हैं। – Mehrdad

1

डेनिस कश्मीर प्रतिक्रिया के आधार पर

देखें: https://msdn.microsoft.com/library/dn727674.aspx

यह आपके ऐप की क्लासिक startpoint करने के लिए Windows विशिष्ट entrypoint जोड़ता है:

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char*, int nShowCmd) 
{ 
    return main(__argc, __argv); 
} 
संबंधित मुद्दे