I am currently trying to do a validation at the uninstall moment. In a Pascal script function, in Inno Setup, I want to search for a specific processes, with a wild card if possible. Then, loop through all find results, get the Image Name and Image Path Name, in order to check if the program that is about to be uninstalled is the same as the one running.

Is there a way to do that?

This is an exemplary task for WMI and its WQL language. Getting list of running processes through WMI is even more reliable than Windows API. The below example shows how to query the Win32_Process class with the LIKE operator:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program [Code]
type
TProcessEntry = record
PID: DWORD;
Name: string;
Description: string;
ExecutablePath: string;
end;
TProcessEntryList = array of TProcessEntry; function GetProcessList(const Filter: string;
out List: TProcessEntryList): Integer;
var
I: Integer;
WQLQuery: string;
WbemLocator: Variant;
WbemServices: Variant;
WbemObject: Variant;
WbemObjectSet: Variant;
begin
Result := 0; WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WbemServices := WbemLocator.ConnectServer('localhost', 'root\CIMV2'); WQLQuery :=
'SELECT ' +
'ProcessId, ' +
'Name, ' +
'Description, ' +
'ExecutablePath ' +
'FROM Win32_Process ' +
'WHERE ' +
'Name LIKE "%'+ Filter +'%"'; WbemObjectSet := WbemServices.ExecQuery(WQLQuery);
if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
begin
Result := WbemObjectSet.Count;
SetArrayLength(List, WbemObjectSet.Count);
for I := 0 to WbemObjectSet.Count - 1 do
begin
WbemObject := WbemObjectSet.ItemIndex(I);
if not VarIsNull(WbemObject) then
begin
List[I].PID := WbemObject.ProcessId;
List[I].Name := WbemObject.Name;
List[I].Description := WbemObject.Description;
List[I].ExecutablePath := WbemObject.ExecutablePath;
end;
end;
end;
end; procedure InitializeWizard;
var
S: string;
I: Integer;
Filter: string;
ProcessList: TProcessEntryList;
begin
MsgBox('Now we try to list processes containing "sv" in their names...',
mbInformation, MB_OK); Filter := 'sv';
if GetProcessList(Filter, ProcessList) > 0 then
for I := 0 to High(ProcessList) do
begin
S := Format(
'PID: %d' + #13#10 +
'Name: %s' + #13#10 +
'Description: %s' + #13#10 +
'ExecutablePath: %s', [
ProcessList[I].PID,
ProcessList[I].Name,
ProcessList[I].Description,
ProcessList[I].ExecutablePath]);
MsgBox(S, mbInformation, MB_OK);
end;
end;
answered Jan 28 '14 at 14:39
TLama

55.1k14109177
 
    
That works really well. The only thing is that I get the Executable path in the following format: "PROGRA~1\243~1.106\prog.exe". Can I do something to have the full path, like displayed in the task manager, instead of the compact path with the ~1 ? Strangely, for the second folder, the ~1 is in the middle of the folder name, probably because of the dots in the name... – Amaranth Jan 28 '14 at 20:31
    
That looks like a 8.3 filename. Try to call the ExpandFileName function to expand it to full path. – TLamaJan 28 '14 at 20:39
    
It did not work, but no worries, I found a way that worked for me (it's a bit more complex though). vincenzo.net/isxkb/index.php?title=GetLongPathName_() Thank you for your great help :) – Amaranth Jan 28 '14 at 20:50 
1  
You're welcome! Hm, the ExpandFileName function internally calls GetFullPathName rather than GetLongPathName. It makes me wonder what's the difference between them... – TLama Jan 28 '14 at 21:07
    
I think this only works in Unicode Inno Setup. I use the non-Unicode version and this will compile for me but always errors out. I think Unicode Inno Setup has more support for Variant casting etc... This place I get stuck at on this script is where WbemObjectSet.Count gets used first. – Arvo Bowen Feb 3 at 0:29

Inno Setup Pascal Script to search for running process的更多相关文章

  1. Inno Setup, Pascal 字符串带双引号如何写

    Windows 的路径中如果有空格,就需要用双引号括起来.只能填 ASCII-Code-Number (decimal),不能用一般的 escape 方法. # + path + # 查询这个表的第一 ...

  2. Inno Setup制作安装包的几个问题

    1. 卸载时,如何判断应用程序是否运行    InnoSetup 提供变量AppMutex,用来保存应用程序的Mutex名称.现在很多应用程序都是唯一实例运行.这样避免配置文件被错误修改以及其他很多衍 ...

  3. 20 Inno Setup制作安装包的几个问题

    系统开发好之后,通常需要制作成安装包,才能卖给用户.利用Inno Setup的向导可以制作简单的安装包,但是如果要做个好的安装包的话可能会遇到一些麻烦,今日终于抽空解决了,Inno Setup打包的一 ...

  4. Inno Setup入门(十三)——Pascal脚本(2)

    分类: Install Setup 2013-02-02 11:26 794人阅读 评论(0) 收藏 举报 事件函数(2) function CheckPassword(Password: Strin ...

  5. (转)Inno Setup入门(十三)——Pascal脚本(2)

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250933 事件函数(2) function CheckPassw ...

  6. Inno Setup入门(十三)——Pascal脚本(2)

    事件函数(2) function CheckPassword(Password: String): Boolean; 如果安装程序在Pascal 脚本中发现该函数,它自动显示密码页并调用CheckPa ...

  7. 【Inno Setup】Pascal 脚本 ---- 事件函数

    转载 事件函数 Inno Setup支持以下函数和过程. 1. [安装初始化]该函数在安装程序初始化时调用,返回False 将中断安装,True则继续安装,测试代码如下: function Initi ...

  8. Inno Setup入门(十二)——Pascal脚本(1)

    事件函数(1) Inno Setup支持以下函数和过程. function InitializeSetup(): Boolean; 该函数在安装程序初始化时调用,返回False 将中断安装,True则 ...

  9. (转)Inno Setup入门(十二)——Pascal脚本(1)

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250917 事件函数(1) Inno Setup支持以下函数和过程 ...

随机推荐

  1. [转]android 自定义圆形imageview控件

      android布局 首先,定义定义圆形Imageview类: import android.content.Context; import android.graphics.Bitmap; imp ...

  2. MySQL时间戳与日期互转

    1.UNIX时间戳转换为日期用函数: FROM_UNIXTIME() ); 输出:2006-08-22 12:11:10 2.日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() sel ...

  3. MOSFET pair makes simple SPDT switch

    With an n- and p-channel MOSFET, you can easily implement a single-pole double-throw (SPDT) switch t ...

  4. springBoot-自定义监听器

    package com.cx.springboot.mylistener; import org.springframework.boot.context.event.ApplicationReady ...

  5. CSRF攻击演示

    CSRF就是伪装成用户做坏事! 它的手段可能是: 一张引发邪恶请求的图片: <img src="http://localhost/demoA.php?money=500" / ...

  6. 打造android万能上拉下拉刷新框架——XRefreshView (二)

    打造Android万能上拉下拉刷新框架--XRefreshView(一) 打造Android万能上拉下拉刷新框架--XRefreshView(三) 一.前言 自从上次发表了打造android万能上拉下 ...

  7. mysql -- 用索引应避免空值

    由于数据库的复杂性,以讹传讹的空间非常大,快赶上中医养生了.避免使用 NULL 的理由,在高性能MySQL里有提到一段.建议大家多读些书,少看网上的奇技淫巧.特意把书翻出来摘录了下以供参考: 要尽量避 ...

  8. [Android Studio] Android Studio底边栏选项不见了,如何调出来

    转载:http://blog.csdn.net/hyr83960944/article/details/38067785 Android Studio底边有一个选项栏,包含了Run,Android等等 ...

  9. LaTeX排版设置图表的位置 Positioning images and tables

    Positioning images and tables LATEX is an editing tool that takes care of the format so you only hav ...

  10. ChartView与LineSeries搭配实现曲线局部缩放功能

    效果图: 上一篇文章实现的时候还不知道有QtChart这个模块......好好看了下资料就想做个例子实现一下这功能,比较了下代码量...恩,直接看代码: Rectangle { id: view_re ...