इनो सेटअप अनइंस्टॉल करते समय घटकों को हटाने में विफल रहता है क्योंकि मेरा प्रोग्राम अभी भी चल रहा है और निष्पादन योग्य को हटाया नहीं जा सकता है। अनइंस्टॉल करने की अनुमति देने से पहले यह देखने के लिए कि यह चल रहा है या नहीं, यह कैसे जांच सकता है?अनइंस्टॉल विफल रहता है क्योंकि प्रोग्राम चल रहा है। हटाने की कोशिश करने से पहले मैं चल रही प्रक्रिया के लिए इनो सेटअप जांच कैसे करूं?
उत्तर
चेक इन
Inno Setup: Detect instances running in any user session with AppMutex
Inno Setup: Is application running?
Inno Setup: Detect if an application is running
कई तरीके हैं। अपने कार्यक्रम को परिभाषित करता है एक म्युटेक्स
[Setup]
AppMutex=MyMutexName
का उपयोग करें या Code
अनुभाग में एक निर्दिष्ट म्युटेक्स के लिए तो
function CheckForMutexes (Mutexes: String): Boolean;
तुम भी
function FindWindowByClassName (const ClassName: String): Longint;
का उपयोग वर्ग के नाम से खिड़की संभाल पाने के लिए कर सकता है और इसे संदेश भेजें।
या यह नाम से मिलता है
function FindWindowByWindowName (const WindowName: String): Longint;
या आप इस विशिष्ट उपयोग के लिए कई DLL फ़ाइलों में से एक का उपयोग
या यह कर
पढ़ने के बाद स्वयंHow To Terminate an Application "Cleanly" in Win32
How To Enumerate Applications Using Win32 APIs (यह एक जर्मन संस्करण के लिए लिंक किसी कारण से के रूप में मैं KB175030
के अंग्रेजी संस्करणनहीं मिल या गूगल की कोशिश कर सकते KB175030-डे
के संस्करण अनुवाद KB175030 DE -> EN
हमने उपरोक्त वर्णित तरीके से एक और तरीका उपयोग किया। चूंकि यह एक अनइंस्टॉलेशन है, हम एप्लिकेशन को मार सकते हैं और इसे अनइस्टॉल कर सकते हैं। simpliest रास्ता, जब यू AppMutex का उपयोग नहीं कर सकते हैं: (Really killing a process in Windows से संबंधित)
[UninstallRun]
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"
आशा किसी को इस में मदद मिलेगी। मैंने इसके लिए एक लंबा समय खोजा।
क्या 'टास्ककिल' एक ही प्रक्रिया के एक से अधिक चल रहे उदाहरण को मारता है? – TLama
ने इसे नोटपैड.एक्सई के साथ आजमाया और यह बहुत अच्छा काम कर रहा है। यह बिना किसी प्रतिक्रिया के आवेदन को मार देगा। – kdoteu
धन्यवाद! हां, यह सभी उदाहरणों को मारता है जब तक आप प्रक्रिया को ऊंचा नहीं होने तक कम विशेषाधिकारों के साथ सेटअप चलाते हैं। [वैसे भी 1] :) – TLama
इस समाधान का प्रयास करें! मुझे ऐप बंद करने के अन्य समाधानों के साथ समस्याएं थीं, लेकिन इनो सेटअप ने अभी भी सोचा था कि इंस्टॉल की गई फाइलें लॉक हैं।
अपने स्थिरांक परिभाषित करने के लिए याद रखें:
#define MyAppName "AppName"
#define MyAppExeName "AppName.exe"
[Code]
function InitializeUninstall(): Boolean;
var ErrorCode: Integer;
begin
ShellExec('open','taskkill.exe','/f /im {#MyAppExeName}','',SW_HIDE,ewNoWait,ErrorCode);
ShellExec('open','tskill.exe',' {#MyAppName}','',SW_HIDE,ewNoWait,ErrorCode);
result := True;
end;
original source of this solution करने के लिए मेजर सहारा।
यह बहुत अच्छा है, एक चीज जिसे मैंने बदल दिया था "फ़ंक्शन InitializeUninstall(): बूलियन;" के बजाय एक अलग प्रक्रिया का उपयोग करना था। इस तथ्य के कारण कि यह कार्य ऐप को मार देगा, भले ही उपयोगकर्ता अनइंस्टॉल प्रक्रिया को रद्द कर दे, जबकि "प्रक्रिया प्रारंभ करें अनइंस्टॉल प्रोग्रेसफॉर्म;" केवल तभी चलाएगा जब वह अनइंस्टॉल करने की पुष्टि करता है। –
अनइंस्टॉलर को आगे बढ़ने से रोकने के लिए AppMutex
directive का उपयोग करें, जब कोई एप्लिकेशन चल रहा हो।
[Setup]
AppMutex=MyProgMutex
एप्लिकेशन को निर्देश द्वारा निर्दिष्ट म्यूटेक्स बनाना है। उदाहरण के लिए लिंक AppMutex
निर्देश दस्तावेज देखें।
आप अनइंस्टॉलर एप्लिकेशन को समाप्त करना चाहते हैं, जब यह अभी भी चल रहा है, बजाय इस कोड का उपयोग:
function InitializeUninstall(): Boolean;
var
ErrorCode: Integer;
begin
if CheckForMutexes('MyProgMutex') and
(MsgBox('Application is running, do you want to close it?',
mbConfirmation, MB_OKCANCEL) = IDOK) then
begin
Exec('taskkill.exe', '/f /im MyProg.exe', '', SW_HIDE,
ewWaitUntilTerminated, ErrorCode);
end;
Result := True;
end;
ऊपर AppMutex
निर्देश के साथ के रूप में, आवेदन म्युटेक्स बनाने के लिए है CheckForMutexes
कॉल में निर्दिष्ट है।
ध्यान दें कि इंस्टॉलर के लिए, आपको इसे कोड करने की आवश्यकता नहीं है। इंस्टॉलर ने अंतर्निहित प्रबंधक को पुनरारंभ किया है।
Kill process before (re)install using "taskkill /f /im" in Inno Setup देखें।
बहुत बढ़िया उत्तर। बहुत गहन; धन्यवाद! वैश्विक म्यूटेक्स विकल्प को सही करने के लिए 5 मिनट लग गए! उससे बेहतर कुछ भी नहीं। – max
क्या आपके पास नेटवर्क आधारित फ़ाइल का उत्तर है जिसे किसी अन्य कंप्यूटर की मेमोरी पर खोला जा सकता है? – none
केबैक 175030 का नवीनतम अंग्रेजी संस्करण जो मुझे वेबैक मशीन पर मिल सकता है फरवरी 2007 से है: http://web.archive.org/web/20070216103757/http://support.microsoft.com/kb/175030। –