2010-03-02 14 views
5

मेरे पास एक इनो सेटअप प्रोजेक्ट है जिसे मैं जांचना चाहता हूं कि एप्लिकेशन वास्तव में इसे अनइंस्टॉल करने से पहले चल रहा है या नहीं। मैंने कई तरीकों की कोशिश की लेकिन विंडोज 7 में चलने पर यह सब चुपचाप विफल हो जाता है। उदाहरण के लिए psvince.dll का उपयोग कर प्रक्रिया को निम्नलिखित स्क्रिप्ट false देता है चाहे नोटपैड चल रहा हो या नहीं।चल रहे प्रक्रिया के लिए इनो सेटअप जांच

मैंने सी # एप में psvince.dll का उपयोग किया, यह जांचने के लिए, अगर यह विंडोज 7 के तहत काम करता है और यह बिना किसी समस्या के काम करता है। तो मेरा सबसे अच्छा अनुमान यह है कि इंस्टॉलर यूएसी सक्षम के साथ सही ढंग से नहीं चल सकता है।

[Code] 
function IsModuleLoaded(modulename: String): Boolean; 
external '[email protected]:psvince.dll stdcall'; 

function InitializeSetup(): Boolean; 
begin 
    if(Not IsModuleLoaded('ePub.exe')) then 
    begin 
     MsgBox('Application is not running.', mbInformation, MB_OK); 
     Result := true; 
    end 
    else 
    begin 
     MsgBox('Application is already running. Close it before uninstalling.', mbInformation, MB_OK); 
     Result := false; 
    end 
end; 
+0

मुझे एक ही समस्या है, लेकिन AnsiString ने मेरी मदद नहीं की। –

उत्तर

7

क्या आप यूनिकोड इनो सेटअप का उपयोग कर रहे हैं? यदि आप हैं, तो यह कहना चाहिए कि

function IsModuleLoaded(modulename: AnsiString): Boolean;

क्योंकि psvince.dll यूनिकोड डीएल नहीं है।

इसके अलावा उदाहरण epub.exe के लिए जांचता है, notepad.exe नहीं।

+0

मुझे एक ही समस्या है, लेकिन AnsiString ने मेरी मदद नहीं की। –

+0

http://www.lextm.com/2012/03/new-inno-setup-installer-script-samples.html –

4

इनो सेटअप में वास्तव में एक AppMutex निर्देश है, जिसे सहायता में दस्तावेज किया गया है। कार्यान्वित करने के लिए कोड की 2 लाइनों की आवश्यकता होती है।

अपने iss फ़ाइल के [सेटअप] अनुभाग में आप जोड़ें:

AppMutex=MyProgramsMutexName 

और फिर अपने आवेदन स्टार्टअप के दौरान कोड के इस पंक्ति जोड़ें:

CreateMutex(NULL, FALSE, "MyProgramsMutexName"); 
+1

[आधिकारिक दस्तावेज़] (http://www.jrsoftware.org/iskb.php?mutexsessions) कहता है, कि आपको अन्य उपयोगकर्ताओं द्वारा लॉन्च किए गए उदाहरणों का पता लगाने के लिए दो म्यूटेक्स की आवश्यकता है। – Igor

5

तुम भी WMIService उपयोग करने के लिए कोशिश कर सकते हैं :

procedure FindApp(const AppName: String); 
var 
    WMIService: Variant; 
    WbemLocator: Variant; 
    WbemObjectSet: Variant; 
begin 
    WbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    WMIService := WbemLocator.ConnectServer('localhost', 'root\CIMV2'); 
    WbemObjectSet := WMIService.ExecQuery('SELECT * FROM Win32_Process Where Name="' + AppName + '"'); 
    if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then 
    begin 
    Log(AppName + ' is up and running'); 
    end; 
end; 
1

आप इस कोड का उपयोग यह जांचने के लिए कर सकते हैं कि notepad.exe चल रहा है या नहीं।

[Code] 
function IsAppRunning(const FileName: string): Boolean; 
var 
    FWMIService: Variant; 
    FSWbemLocator: Variant; 
    FWbemObjectSet: Variant; 
begin 
    Result := false; 
    FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator'); 
    FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', ''); 
    FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName])); 
    Result := (FWbemObjectSet.Count > 0); 
    FWbemObjectSet := Unassigned; 
    FWMIService := Unassigned; 
    FSWbemLocator := Unassigned; 
end; 

function InitializeSetup: boolean; 
begin 
    Result := not IsAppRunning('notepad.exe'); 
    if not Result then 
    MsgBox('notepad.exe is running. Please close the application before running the installer ', mbError, MB_OK); 
end; 
+3

यह ['इस पोस्ट'] से अलग कैसे है (http://stackoverflow.com/a/24181158/960757)? यह ठीक है। आपको ऑब्जेक्ट्स को 'असाइन नहीं किया गया' असाइन करने की आवश्यकता नहीं है क्योंकि जब वे फ़ंक्शन के दायरे से बाहर निकलते हैं तो उन्हें * रिलीज़ * किया जाएगा। और आपको क्वेरी चलाने के बाद असाइनमेंट की जांच करनी चाहिए (अन्य पोस्ट में 'VarIsNull')। तो, दूसरी पोस्ट थोड़ा छोटा और अधिक सटीक है। – TLama

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