2012-11-16 20 views
5

देता है मैं this code के समान CreateProcessAsUser() API का उपयोग कर किसी सेवा से उपयोगकर्ता-मोड प्रक्रिया शुरू करने का प्रयास कर रहा हूं। मेरा कोड 99% समय में ठीक काम करता है, एपीआई सफल होने के समय को छोड़कर, मुझे प्रक्रिया PROCESS_INFORMATION संरचना से संभालती है लेकिन प्रक्रिया स्वयं इंटरैक्टिव उपयोगकर्ता सत्र में दिखाई नहीं देती है जिसे मैं चलाने के लिए इरादा रखता था।CreateProcess सफल होता है, लेकिन GetExitCodeProcess C0000142

दिलचस्प बात यह है कि यदि मैं प्रक्रिया संभाल पर GetExitCodeProcess() पर कॉल करता हूं तो यह रिटर्न कोड 0xC0000142 के साथ सफल होता है। कोई विचार क्यों?

+0

जब विफलता होती है, तो क्या आप बच्चे की प्रक्रिया बिल्कुल शुरू कर सकते हैं? क्या यह संभव है कि आप जिस .exe को लॉन्च करने का प्रयास कर रहे हैं वह डीएलएल पर निर्भर करता है जो गायब हैं? –

+1

रिटर्न कोड निश्चित रूप से व्यवहार फिट बैठता है, यह STATUS_DLL_INIT_FAILED है। जो निश्चित रूप से प्रक्रिया शुरू करने से रोक देगा। डीएलएल में से एक यह अपने DllMain() प्रविष्टि बिंदु से FALSE रिटर्न का उपयोग करता है। आपको इसे अपनी देव मशीन पर पुनर्मुद्रण करने की आवश्यकता होगी ताकि आप इसे डीबग कर सकें। –

+0

@ हंसपैसेंट और माइकलश सलाह के लिए धन्यवाद। मुझे उस उपयोगकर्ता सत्र में लॉग इन करने का प्रयास करना होगा और देखें कि क्या मैं मैन्युअल रूप से प्रक्रिया शुरू कर सकता हूं। मुद्दा यह है कि यह हर समय नहीं होता है ... लेकिन, मेरे पास सवाल यह है कि CreateProcessAsUser() सत्य क्यों लौटाता है जब यह स्पष्ट रूप से कुछ भी शुरू नहीं करता है? – ahmd0

उत्तर

6

त्रुटि 0xC0000142 STATUS_DLL_INIT_FAILED है (मैंने इसे Error Code Lookup Tool का उपयोग करके निर्धारित किया है)। एक त्वरित गूगल this question पाया है, जो कहते हैं:

इस समस्या का सबसे आम कारण है कि एक प्रोग्राम है जो user32.dll से जोड़ता है एक किस संदर्भ में उसे सिस्टम के विंडो स्टेशन और डेस्कटॉप से ​​बात नहीं कर सकता है में चला गया था। आम तौर पर, एजेंट जैसी एक सेवा अपने स्वयं के विंडो स्टेशन और डेस्कटॉप में चलती है, और उपयोगकर्ता 32 प्रोग्राम ठीक चलते हैं, लेकिन कोई भी प्रोग्राम जो एक संवाद बॉक्स प्रदर्शित करता है, तब किसी व्यक्ति को त्रुटि संदेश देखने या संवाद बंद करने के किसी भी अवसर के बिना लटका दिया जाएगा ।

तो, यदि आप user32.dll से किसी भी फ़ंक्शन का उपयोग नहीं कर रहे हैं, तो आपको उस निर्भरता को हटा देना चाहिए। यदि आप उस डीएलएल का उपयोग कर रहे हैं, तो मुझे सच में यकीन नहीं है कि आपको क्या करना है। एक विकल्प LoadLibrary के साथ गतिशील रूप से डीएलएल लोड करना होगा और यदि यह सफल होता है तो इसका उपयोग करें (यानी आपके पास वैध विंडो सत्र है) या विफल होने पर विफलता मोड पर फ़ॉलबैक करने के लिए।

+0

धन्यवाद। मै कोशिश करुॅगा। हालांकि उपयोगकर्ता 32.dll का उपयोग नहीं करना मुश्किल है, आपको पता है ... मेरा कोड निश्चित रूप से किसी भी उपयोगकर्ता सामग्री प्रदर्शित नहीं करता है। यह सब करता है, यह एक वैश्विक नामित घटना खोलता है और इसे सेट करता है और फिर त्रुटि कोड में परिणाम देता है। – ahmd0

+0

यदि आप कम अखंडता प्रक्रिया चलाते हैं तो ऐसा कोई कारण नहीं होगा, लेकिन यदि आप सेवा के रूप में लॉन्च की गई मध्यम अखंडता (या उच्चतर) चलाते हैं? –

+0

त्रुटि कोड लुकअप टूल के लिंक के लिए उपरोक्त, क्योंकि त्रुटि कोड के लिए googling इन दिनों गधे में दर्द है। –

5

CreateProcess ...() एपीआई सत्य लौटाएंगे यदि वे सफलतापूर्वक आंतरिक प्रक्रिया ऑब्जेक्ट बना सकते हैं और प्रारंभ प्रारंभिकरण; वे प्रक्रिया को लोड करने और इसकी निष्पादन योग्य छवि चलाने शुरू करने की प्रतीक्षा नहीं करते हैं। कुछ मामलों में प्रारंभिक बाद में विफल रहता है, लेकिन कर्नेल के परिप्रेक्ष्य से यह अभी भी एक सफल प्रक्रिया निर्माण था।

+0

अच्छा बिंदु। धन्यवाद। तो यह जानने का सही तरीका क्या है कि मेरी प्रक्रिया "निश्चित रूप से" शुरू हो गई है? – ahmd0

+0

जब तक आप सीधे पाइप या किसी चीज़ के माध्यम से प्रक्रिया के साथ संवाद नहीं कर सकते, मुझे विश्वास है कि CreateProcess() के बाद थोड़ा इंतजार करना और STILL_ACTIVE रिटर्न कोड की जांच करने के लिए GetExitCodeProcess() को कॉल करना सबसे अच्छा तरीका है। – HerrJoebob

+0

या 'WaitForInputIdle() 'का उपयोग करें। –

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