मेरे पास एक इंस्टॉलर है जो उपयोगकर्ताओं को इंस्टॉल के बाद अपने कंप्यूटर को पुनरारंभ करने के लिए प्रेरित करता है। मैं इस मामले में उपयोगकर्ता को अपने कंप्यूटर को पुनरारंभ नहीं करना चाहूंगा, और एक्सप्लोरर.एक्सई को विंडोज विस्टा और ऊपर के साथ प्रदान किए गए रीस्टार्टमैनेजर एपीआई का उपयोग करके स्वयं को पुनरारंभ करना होगा।

मैंने एक अलग निष्पादन योग्य बनाया है जो इंस्टॉल के दौरान स्थानीय कंप्यूटर पर कॉपी हो जाता है और उसके बाद चलता है। अलग निष्पादन योग्य रजिस्टर explorer.exe, इसे बंद कर देता है, और इस कोड के आधार पर इसे पुनरारंभ करता है: http://msdn.microsoft.com/en-us/library/aa373681%28v=VS.85%29.aspx। जब एक्ज़ीक्यूटेबल को इंस्टॉलर से अलग से चलाया जाता है, तो यह डिज़ाइन के अनुसार काम करता है। लेकिन जब यह इंस्टालशील्ड के साथ बनाए गए एमएसआई पैकेज के हिस्से के रूप में एक कस्टम क्रिया के रूप में चलता है, तो यह explorer.exe को बंद कर देता है लेकिन इसे पुनरारंभ नहीं करता है।

जब यह इंस्टॉलर के साथ चलता है तो मुझे हमेशा RmRestart के लिए 160 त्रुटि कोड मिलता है। दस्तावेज़ कहते हैं कि यह एक त्रुटि कोड है जिसका अर्थ है कि अमान्य तर्क प्रदान किए गए थे। (http://msdn.microsoft.com/en-us/library/aa373665%28v=vs.85%29.aspx)। मैं काफी सकारात्मक हूं कि मेरे तर्क अमान्य नहीं हैं क्योंकि वे तब काम करते हैं जब निष्पादन योग्य विंडोज इंस्टालर से अलग चलता है।

मैं इस बिंदु पर फंस गया हूं और यह सुनिश्चित नहीं कर रहा हूं कि यह काम करने के लिए और क्या करना है। केवल एक चीज जिसके बारे में मैं अनिश्चित हूं वह यह है कि यदि "0" 0 (सफलता) के त्रुटि कोड के साथ RmStartSession() से लौटाया गया एक उचित सत्र हैंडल हो सकता है। यह मानते हुए कि यह गलत था, मैंने अपने निष्पादन योग्य को RmSessionKey में भी लेने के लिए सेट किया जो कि InstallValidate से पहले विंडोज इंस्टालर द्वारा बनाया गया है। और मैं अपने निष्पादन योग्य को स्थगित कार्रवाई के रूप में कॉल करने के लिए इसका उपयोग करता हूं। मुझे इस मामले में RmShutdown के लिए 4c3 की त्रुटि मिलती है, जो एक अमान्य त्रुटि कोड प्रतीत होता है।

चट्टानें: अलग .exe है जो शटडाउन के लिए RestartManager API का उपयोग करता है, Explorer.exe को पुनरारंभ करें जो विंडोज इंस्टालर के साथ नहीं चलने पर काम करता है, लेकिन जब संयुक्त होता है, तो यह टूट जाता है। RmRestart () के लिए 160 का त्रुटि कोड देखना। यह काम करने की कोशिश करने के लिए विचारों से बाहर भाग गया। अगर लोग चाहें तो मैं कोड स्निपेट प्रदान कर सकता हूं...

किसी भी सुझाव/टिप्पणी के लिए धन्यवाद।

1
Tony 8 अगस्त 2011, 10:50

1 उत्तर

सबसे बढ़िया उत्तर

मैं इसके समाधान तक पहुंच गया ...

एक अलग निष्पादन योग्य बनाने के बजाय जो explorer.exe पंजीकृत करता है और इसे बंद कर देता है, एक एमएसआई डीएलएल कस्टम एक्शन बनाएं। यह सभी डीएलएल के पास एक ही कार्य है जो एक्सप्लोरर.एक्सई को पुनरारंभ करने के लिए पंजीकृत करता है और विंडोज इंस्टालर (डिफ़ॉल्ट रूप से) द्वारा प्रदान किए गए मौजूदा पुनरारंभ प्रबंधक सत्र का उपयोग करता है। फिर अपने इंस्टॉलर में, MsiFilesInUse डायलॉग जोड़ें और आपका जाना अच्छा रहेगा।

अब जब इंस्टॉलर चलता है, तो यह पुनरारंभ प्रबंधक सत्र शुरू करता है, और आपके एमएसआई डीएलएल सीए को कॉल करता है, और सूची में explorer.exe जोड़ता है। सूची प्रदर्शित हो जाती है और उपयोगकर्ता को एप्लिकेशन को बंद करने या बंद करने के लिए विकल्प दिए जाते हैं।

इस पद्धति का उपयोग करने से आप उपयोगकर्ता को एक व्यर्थ निष्पादन योग्य वितरित करने से बच सकते हैं, साथ ही साथ लिखे गए कोड की मात्रा को भी सरल बना सकते हैं।

0
Tony 4 अप्रैल 2012, 09:16