Inno Setup 安装、卸载前检测进程或服务
2015-11-05 06:11
399 查看
[转载]Inno Setup 安装、卸载前检测进程或服务
(2015-04-24 17:37:20)转载▼
标签:转载 |
1、32位程序的PSVince.dll插件方法。
[Files] Source: psvince.dll; Flags: dontcopy [Code] function IsModuleLoaded(modulename: AnsiString ): Boolean; external 'IsModuleLoaded@files:psvince.dll stdcall';
2、PSVince控件在64位系统(Windows 7/Server 2008/Server 2012)下无法检测到进程,使用下面的函数可以解决。
function IsAppRunning(const FileName : string): Boolean; var FSWbemLocator: Variant; FWMIService : Variant; FWbemObjectSet: Variant; begin Result := false; try FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator'); FWMIService := FSWbemLocator.ConnectServer('', 'rootCIMV2', '', ''); FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName])); Result := (FWbemObjectSet.Count > 0); FWbemObjectSet := Unassigned; FWMIService := Unassigned; FSWbemLocator := Unassigned; except if (IsModuleLoaded(FileName)) then begin Result := false; end else begin Result := true; end end; end;
这里,有可能存在异常:Exception: SWbemLocator:依赖服务或组件无法启动
解决办法参照如下步骤:
1.在命令提示行运行以下命令:
cd /d %windir%system32wbem
rename Repository Rep_bak
2.建一个.bat批处理文件并运行,内容如下:
Mofcomp C:WINDOWSsystem32WBEMcimwin32.mof
Mofcomp C:WINDOWSsystem32WBEMcimwin32.mfl
Mofcomp C:WINDOWSsystem32WBEMsystem.mof
Mofcomp C:WINDOWSsystem32WBEMwmipcima.mof
Mofcomp C:WINDOWSsystem32WBEMwmipcima.mfl
3.在命令提示行运行以下命令:
cd /d %windir%system32wbem
for %i in (*.mof,*.mfl) do Mofcomp %i
4.重新注册 WMI 组件,在命令提示行运行以下命令:
cd /d %windir%system32wbem
for %i in (*.dll) do RegSvr32 -s %i
for %i in (*.exe) do %i /RegServer
//安装,并在安装前检测程序是否在运行,如果运行先结束进程
function InitializeSetup(): Boolean; begin Result := true; if IsAppRunning('{#MyAppExeName}') then begin if MsgBox('安装程序检测到 {#MyAppName} 正在运行!'#13''#13'单击“是”按钮关闭程序并继续安装;'#13''#13'单击“否”按钮退出安装!', mbConfirmation, MB_YESNO) = IDYES then begin TaskKillProcessByName('{#MyAppExeName}'); Result:= true; end else Result:= false; end; end;
//卸载,与安装类似
function InitializeUninstall(): Boolean; begin Result:= true; if IsAppRunning('{#MyAppExeName}') then begin if MsgBox('卸载程序检测到 {#MyAppName} 正在运行!'#13''#13'单击“是”按钮关闭程序并继续卸载;'#13''#13'单击“否”按钮退出卸载!', mbConfirmation, MB_YESNO) = IDYES then begin TaskKillProcessByName('{#MyAppExeName}'); Result:= true; end else Result:= false; end; end;
相关文章推荐
- 断点续传2
- 断点续传
- Python_编程特色
- 5.2 模型表示
- LeetCode Maximum Gap
- 线程池ThreadPoolExecutor使用简介(转)
- 在终端下使用Git上传本地代码至GitHub
- Lesson2 Square number
- aps clang: error: linker command failed with exit code 1 (use -v to see invocation)
- Codeforces Round #329 (Div. 2) A 2Char
- 这一页干的真多...
- 第九周学习报告
- *LeetCode-Longest Increasing Subsequence
- 黑马程序员-Java I/O流(一)-IO流概述、字符流、字节流、流操作规律
- Linux日志处理
- Vim 学习资料
- codeforce A. 2Char(水题,暴力)
- OPENCV配置 C1083: 无法打开包括文件:“opencv2/opencv.hpp”
- POJ 3026 解题报告
- 记一次接口开发