最近工作项目需求,要用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);
同样的方法也可以用于删除卸载残留的一些文件。
呵呵,简短的语句可能说得不够清楚,大概的思路有了,细节处还是要根据需求灵活的实现。