2009-01-16 14 views
20

क्या Win32 एपीआई में लिनक्स/यूनिक्स stdio.h popen() फ़ंक्शन के बराबर बराबर है? यदि हां, मुझे यह कहां मिल सकता है?Win32 API में Posix popen() के बराबर क्या है?

संपादित करें: मुझे डी मानक पुस्तकालय में एक चूक को पैच करने के लिए यह जानने की आवश्यकता है। किसी भी उत्तर का उपयोग केवल मानक Win32 API, कोई MSVC- विशिष्ट फ़ंक्शन का उपयोग करना चाहिए। साथ ही, मैं ऐसा कुछ पसंद करूंगा जो बहुत कम स्तर पर न हो, यदि यह मौजूद है।

+0

_popen विंडोज पर मानक सी लाइब्रेरी का हिस्सा है और मानक सी लाइब्रेरी के खिलाफ किसी के साथ जुड़ने/उपयोग करने के लिए उपलब्ध है। –

+0

ठीक है, ठीक है, मुझे लगता है कि यह डी से काम नहीं कर रहा है, जो सी एबीआई का समर्थन करता है, लेकिन शायद यह इस प्रश्न के दायरे से बाहर है। – dsimcha

+4

विंडोज नहीं है लिनक्स; ओएस में कोई मानक सी लाइब्रेरी नहीं है। KERNEL32.DLL में printf नहीं है() – MSalters

उत्तर

19

एमएसडीएन बताता है कि आप Pipe Handle Inheritance में विंडोज एपीआई का उपयोग करके क्या पॉपन करते हैं। Here यह एक अच्छी तरह से प्रलेखित उदाहरण प्रदान करता है। यह जेसन द्वारा जुड़े रनटाइम लाइब्रेरी में मिले _popen फ़ंक्शन से अधिक निम्न स्तर है, लेकिन Win32 API का विशेष रूप से उपयोग करता है।

+2

ओह, मुझे यह जवाब मेरी तुलना में बहुत बेहतर लगता है :) –

+0

यह बहुत दिलचस्प लग रहा है, और क्या मेरी डिलीवरी की समयसीमा पर 2 दिन देर नहीं हुई थी, मुझे इस समाधान को लागू करने में रुचि हो सकती है :-)। लेकिन मेरी ज़रूरतों के लिए (मैं सिर्फ स्टडआउट कैप्चर करना चाहता हूं), '_popen' पर्याप्त से अधिक है। – Guss

+0

क्या आप एमएसडीएन पेज पर एक लिंक पोस्ट करना भूल गए हैं? यह अच्छी तरह से प्रलेखित उदाहरण कहां है? –

15

यदि आप कंसोल एप्लिकेशन लिख रहे हैं तो आप _popen पर कॉल कर सकते हैं। अधिक जानकारी के लिए, एमएसडीएन साइट पर प्रलेखन देखें: http://msdn.microsoft.com/en-us/library/96ayss4b(VS.80).aspx

+2

मुझे तुम्हारा भी पसंद है, दोस्त। सीधे उस लड़के को फिट करता है जो मुझे लगता है :) –

4

अफसोस की बात यह विशेष रूप से आसान नहीं है।

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

फिर आपको CreateProcess (जो STARTUPINFO समेत कई संरचना पॉइंटर्स लेता है) का उपयोग करके एक प्रक्रिया बनाने की आवश्यकता है, और STARTUPINFO को उस हैंडल में पास करें जिसे आपने अपने stdout के रूप में डुप्लिकेट किया है।

तब तक आप पाइप (रीडफाइल इत्यादि) के पढ़ने के अंत से पढ़ सकते हैं जब तक कि आप ईओफ़ तक नहीं पहुंच जाते, तो आपको सभी विभिन्न Win32 हैंडल बंद करके साफ करने की आवश्यकता होती है।

1

एक पुराने धागा ऊपर खुदाई ...

ऊपर जेसन कोको के जबाब पर प्रतिक्रिया और क्या जुड़ा हुआ MSDN पेज के दावों के विपरीत, यह() गैर सांत्वना क्षुधा से _popen कॉल करने के लिए आजकल जाहिरा तौर पर संभव है। मैं इसे क्विकटाइम आयातक घटक से बुलाता हूं, मूल रूप से भेस में एक डीएलएल। यह एक कंसोल विंडो खुलता है लेकिन अन्यथा अपेक्षित व्यवहार दिखाता है। Mingw32 के -mwindows विकल्प के साथ एक मानक कंसोल टूल को संकलित करना, इसे एक जीयूआई ऐप बनाने के लिए, _popen सही तरीके से काम करना जारी रखता है (लेकिन एक कंसोल विंडो किसी अन्य कंसोल से उपकरण चलाते समय भी खुलती है।

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