I have a Inno Setup project that I want to check if the application is actually running before uninstalling it. I tried many ways but it all fails silently, when running in Windows 7. For example the following script that checks for notepad.exe
process using psvince.dll
always returns false
regardless of Notepad being running or not.
I used psvince.dll
in a C# app to check, if it works under Windows 7 and it works without any problem. So my best guess is that installer can not run correctly with UAC enabled.
[Code]
function IsModuleLoaded(modulename: String): Boolean;
external 'IsModuleLoaded@files: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, M开发者_JAVA百科B_OK);
Result := false;
end
end;
Are you using Unicode Inno Setup? If you are, it should say
function IsModuleLoaded(modulename: AnsiString): Boolean;
since psvince.dll isn't a Unicode dll.
Also the example checks for epub.exe, not notepad.exe.
You can also try to use 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;
Inno Setup actually has an AppMutex directive, which is documented in the help. Implementing it requires 2 lines of code.
In the [Setup] section of your iss file you add:
AppMutex=MyProgramsMutexName
And then during your application startup add this line of code:
CreateMutex(NULL, FALSE, "MyProgramsMutexName");
You could use this code to check if notepad.exe is running.
[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;
精彩评论