2009-06-10 18 views
5

मैं एक (Win32 कंसोल) प्रोग्राम है जो किसी अन्य प्रक्रिया लपेटता लिख ​​रहा हूँ करने के लिए argv परिवर्तित वापस; यह निम्न उदाहरण में पैरामीटर लेता है:एक एकल स्ट्रिंग

runas.exe user notepad foo.txt 

यही कारण है: runasuser पार्स करता है और फिर नोटपैड चलाया जाएगा, शेष पैरामीटर प्रदान करने के।

मेरी समस्या यह है कि argv अलग-अलग मानकों में विभाजित है, लेकिन CreateProcessAsUser को एक lpszCommandLine पैरामीटर की आवश्यकता है।

इस कमांड लाइन का निर्माण शायद सिर्फ वापस एक साथ argv में शामिल होने के रिक्त स्थान के साथ के रूप में सरल नहीं है। कोई संकेतक?

यह सिर्फ एक उदाहरण है। मेरा पहला तर्क वास्तव में उपयोगकर्ता नाम नहीं है, और इसमें रिक्त स्थान हो सकते हैं। यह मैन्युअल रूप से GetCommandLine के परिणाम को पार्स कर देता है।

इसी प्रकार, argv का एक बेवकूफ संगतता काम नहीं करेगा, क्योंकि इसे उस मामले से निपटने की आवश्यकता है जहां मूल तर्क उद्धृत किए गए थे और उनमें रिक्त स्थान हो सकते थे।

+1

मैं कहना चाहता हूँ "argv रिक्तियों के साथ वापस एक साथ शामिल होने के" ठीक होगा। आपको अन्यथा क्या लगता है? –

+0

बेनोइट, क्योंकि यह 'runas.exe उपयोगकर्ता नोटपैड" foo bat.txt "के लिए काम नहीं करेगा। – avakar

+3

रिक्त स्थान – Hasturkun

उत्तर

7

मैन्युअल पुनर्संयोजन उन्हें मुश्किल है:

आप के लिए उन्हें फिर से गठबंधन की कोशिश कर सकते, मुझे लगता है कि यह काम करेगा, लेकिन अगले the same command line escaping rules that windows has कर लें। यह आपके द्वारा देखे जा रहे छोटे समाधान से अधिक हो सकता है।

इसके अलावा अगर कोई पैरामीटर कि उन में रिक्त स्थान है, तो आप उन्हें उनके आसपास उद्धरण के साथ स्ट्रिंग के लिए शामिल करना चाहते हैं जाएगा। यहां एक अजीब भागने वाले नियम का एक उदाहरण दिया गया है: यदि आपके पास - फ़ोल्डरपाथ "c:\test\" है तो अंतिम बैकस्लैश को दोगुना करना होगा - फ़ोल्डरपाथ "c:\test\\"

आप MFC उपयोग कर रहे हैं:

आप कर सकते हैं अपने व्युत्पन्न CWinApp के theApp.m_lpCmdLine से मूल्य तुम चाहते हो सकता है। ध्यान दें कि आप अभी भी __argc, और __argv या CommandLineToArgvW के साथ अन्य तरीकों तक पहुंच सकते हैं।

आप (यहां तक ​​कि एक जीयूआई) के बिना केवल Win32 उपयोग कर रहे हैं:

आप इसे WinMain से प्राप्त कर सकते हैं। आपके प्रोग्राम का प्रवेश बिंदु कौन सा हो सकता है।

नोट आप अभी भी __argc, और __argv या CommandLineToArgvW साथ अन्य तरह से भी उन तक पहुँच सकता है।

आप मुख्य या wmain के साथ एक सांत्वना आधारित अनुप्रयोग उपयोग करना आवश्यक है:

Win32 एपीआई GetCommandLine जाने का रास्ता हो रहा है। यद्यपि .exe नाम को पिछले प्राप्त करने के लिए आपको अभी भी इसका विश्लेषण करना होगा। Exe नाम/पथ के आसपास भी खाते उद्धरण में ले लो। यदि शुरुआत में ऐसे कोई उद्धरण नहीं हैं, तो बस शुरुआत के लिए अगली जगह पर जाएं।

+0

रिक्त स्थान के साथ argv concatingating काम करने लगता है; अगर argv [i] में एक स्थान है, तो मैं उस विशेष मान को उद्धृत करता हूं। मैंने कुछ स्पष्ट किनारे के मामलों की कोशिश की है, और यह अब तक अच्छा दिखता है। –

+0

यहां मैस की एक चर्चा है जो विंडोज पर कमांड लाइन से बच रही है: http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way। एएसपीएक्स –

2

आप GetCommandLine फ़ंक्शन का उपयोग कर सकते हैं।

'WinMain' के बजाय 'मुख्य' का उपयोग क्यों नहीं? यह आपको इच्छित प्रारूप में स्ट्रिंग देना चाहिए।

+2

GetCommandLine कॉल का नतीजा संसाधित किया जाना चाहिए हालांकि अगले CreateProcess कॉल पर जाने से पहले। पहला तर्क हटा दिया जाना चाहिए। सावधान रहें कि कार्यक्रम का नाम डबल कोट्स के साथ लपेटा जा सकता है। – hvintus

+0

इस विशेष मामले में, पहले दो तर्कों को हटाने की आवश्यकता है - निष्पादन योग्य और उपयोगकर्ता नाम का नाम भी। –

0

बशर्ते आपके पास पर्याप्त स्थान के साथ आवंटित एक स्ट्रिंग है तो सूची में प्रत्येक आइटम पर स्ट्रैट का उपयोग करें। हां, यह रिक्त स्थान के साथ एक साथ वापस जुड़ने जितना आसान है।

संपादित करें: बेशक, आपको उद्धरणों के भीतर रिक्त स्थान वाले किसी भी आइटम को संलग्न करने की आवश्यकता होगी।

+0

-1, नहीं, यह उतना आसान नहीं है। – avakar

+0

उनके उदाहरण के लिए, हाँ यह होगा। उद्धरण के साथ रिक्त स्थान वाले किसी भी आइटम के आसपास की चेतावनी आपको इस पर सही दिखाई देगी ... – Xetius

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