(2011-12-29 11:54:56)
标签:

innosetup

it

分类: 开发工具经验累积
Inno Setup在安装程序前,如果有使用的进程在运行,会有错误提示,而使得Installer无法写入。
同样,在卸载程序前,如果有使用的进程仍在运行,会有错误提示,之后卸载不干净,需要手动清除。
 
所以,只要在安装程序前或者卸载程序前,检查并关闭掉用到的正在运行的进程,就没有问题啦。
 
[code]
// 安装前检查关闭**进程
procedure CurStepChanged(CurStep: TSetupStep);
var appWnd: HWND;
begin
  if CurStep = ssInstall then
  begin
     // 检查××进程是否在运行,是则关闭进程
     appWnd := FindWindowByWindowName('进程窗口名称');
     if (appWnd <> 0) then
     begin
        PostMessage(appWnd, 18, 0, 0);       // quit
     end;
  end;
end;
 
// 卸载前检查关闭**进程
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var appWnd: HWND;
begin
   // 检查**进程是否在运行,是则关闭进程
   appWnd := FindWindowByWindowName('进程窗口名称');
   if (appWnd <> 0) then
   begin
      PostMessage(appWnd, 18, 0, 0);       // quit
   end;
end;
 
其中,Pascal提供了两个函数用于查找进程窗口:FindWindowByClassNameFindWindowByWindowName,前者是根据类名,后者是根据窗口名,查找与之匹配的顶层窗口句柄。
可以开启进程,然后使用spy++工具,获取进程对应的窗口名或类名。