|
正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
x
最近工作项目需求,要用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);
复制代码
同样的方法也可以用于删除卸载残留的一些文件。
呵呵,简短的语句可能说得不够清楚,大概的思路有了,细节处还是要根据需求灵活的实现。 |
|