2009-10-16 5 views
19

इनो सेटअप अनइंस्टॉल करते समय घटकों को हटाने में विफल रहता है क्योंकि मेरा प्रोग्राम अभी भी चल रहा है और निष्पादन योग्य को हटाया नहीं जा सकता है। अनइंस्टॉल करने की अनुमति देने से पहले यह देखने के लिए कि यह चल रहा है या नहीं, यह कैसे जांच सकता है?अनइंस्टॉल विफल रहता है क्योंकि प्रोग्राम चल रहा है। हटाने की कोशिश करने से पहले मैं चल रही प्रक्रिया के लिए इनो सेटअप जांच कैसे करूं?

उत्तर

20

चेक इन

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

+1

बहुत बढ़िया उत्तर। बहुत गहन; धन्यवाद! वैश्विक म्यूटेक्स विकल्प को सही करने के लिए 5 मिनट लग गए! उससे बेहतर कुछ भी नहीं। – max

+0

क्या आपके पास नेटवर्क आधारित फ़ाइल का उत्तर है जिसे किसी अन्य कंप्यूटर की मेमोरी पर खोला जा सकता है? – none

+0

केबैक 175030 का नवीनतम अंग्रेजी संस्करण जो मुझे वेबैक मशीन पर मिल सकता है फरवरी 2007 से है: http://web.archive.org/web/20070216103757/http://support.microsoft.com/kb/175030। –

14

हमने उपरोक्त वर्णित तरीके से एक और तरीका उपयोग किया। चूंकि यह एक अनइंस्टॉलेशन है, हम एप्लिकेशन को मार सकते हैं और इसे अनइस्टॉल कर सकते हैं। simpliest रास्ता, जब यू AppMutex का उपयोग नहीं कर सकते हैं: (Really killing a process in Windows से संबंधित)

[UninstallRun] 
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t" 

आशा किसी को इस में मदद मिलेगी। मैंने इसके लिए एक लंबा समय खोजा।

+0

क्या 'टास्ककिल' एक ही प्रक्रिया के एक से अधिक चल रहे उदाहरण को मारता है? – TLama

+1

ने इसे नोटपैड.एक्सई के साथ आजमाया और यह बहुत अच्छा काम कर रहा है। यह बिना किसी प्रतिक्रिया के आवेदन को मार देगा। – kdoteu

+2

धन्यवाद! हां, यह सभी उदाहरणों को मारता है जब तक आप प्रक्रिया को ऊंचा नहीं होने तक कम विशेषाधिकारों के साथ सेटअप चलाते हैं। [वैसे भी 1] :) – TLama

6

इस समाधान का प्रयास करें! मुझे ऐप बंद करने के अन्य समाधानों के साथ समस्याएं थीं, लेकिन इनो सेटअप ने अभी भी सोचा था कि इंस्टॉल की गई फाइलें लॉक हैं।

अपने स्थिरांक परिभाषित करने के लिए याद रखें:

#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 करने के लिए मेजर सहारा।

+1

यह बहुत अच्छा है, एक चीज जिसे मैंने बदल दिया था "फ़ंक्शन InitializeUninstall(): बूलियन;" के बजाय एक अलग प्रक्रिया का उपयोग करना था। इस तथ्य के कारण कि यह कार्य ऐप को मार देगा, भले ही उपयोगकर्ता अनइंस्टॉल प्रक्रिया को रद्द कर दे, जबकि "प्रक्रिया प्रारंभ करें अनइंस्टॉल प्रोग्रेसफॉर्म;" केवल तभी चलाएगा जब वह अनइंस्टॉल करने की पुष्टि करता है। –

3

अनइंस्टॉलर को आगे बढ़ने से रोकने के लिए 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 देखें।