使用installshield12制作的安装包在卸载时杀死正在运行的程序

    最近工作项目需求,要用installshield12制作安装包,实现安装注册ATL控件。与ATL一同安装的程序文件还有两个客户端,这两个客户端和迅雷等下载工具类似是在后台运行的,并没有界面显示,所以一般情况下再用户进行卸载的时候这两个程序都会在运行。然而,installshield本身并没有强制关闭正在运行的要卸载的程序。那么,只有自己处理了。

    方法一:首先在Installation Designer页面的Behavior and Logic中单击InstallScript,右击Files在弹出的快捷菜单中选择New Script file,然后新建相关函数。写脚本:

#define  WINDOW    "11.exe"

 

function OnUninstallingFile(szFile)  

HWND hWnd;

begin           

hWnd = FindWindow (WINDOW, "");  

if (hWnd != NULL) then

Delay (3);

SendMessage(hWnd, 0x0111, 32775, 0);

Delay (3);

endif;

 

RegDBSetDefaultRoot (HKEY_LOCAL_MACHINE);

RegDBDeleteValue("//SOFTWARE//Microsoft//Windows//CurrentVersion//Run","11"); 

end;

 

然后再在Behavior and Logic中单击Custom Actions, 右击Custom Actions在弹出的快捷菜单中选择Custom Action Wizard在Action Type中选择Run InstallScript code,在Insert into Sequence中的Install Execute Sequence处选择After ISSelRegisterFinalize或者After InstallFinalize都行,其余按向导提示操作。

 

以上只是个例子,思路就是找到运行的程序的窗口句柄,发消息通知其退出,此种方法只能针对有窗口的程序。

 

方法二:

编写一段VC代码,写出dll文件,加到安装文件里,用custom action来调用,就可以了。调用处和方法一相同,细节调整下就可以了。

HANDLE   hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,   0);     

  HANDLE   hProcess;   

  PROCESSENTRY32   pe;     

 

  pe.dwSize   =   sizeof(pe);     

  BOOL   bNext=Process32First(hSnap,   &pe);     

  while(bNext)     

  {     

  if(_tcsicmp(pe.szExeFile,   TEXT("执行档名称"))   ==   0)   

  {     

  hProcess   =   OpenProcess(PROCESS_ALL_ACCESS,   FALSE,   pe.th32ProcessID);   

  TerminateProcess(hProcess,   0);   

  }     

  bNext=Process32Next(hSnap,   &pe);     

  }   

  CloseHandle(hProcess);   

  CloseHandle(hSnap);   

同样的方法也可以用于删除卸载残留的一些文件。

呵呵,简短的语句可能说得不够清楚,大概的思路有了,细节处还是要根据需求灵活的实现。

你可能感兴趣的:(insert,action,delay,behavior,下载工具,wizard)