请问反安装程序是怎么删除掉自己的

littleriver 2003-02-19 10:12:03
有的程序安装了后,我看到有一个uninstall.exe程序,运行它,出现反安装界面。我发现在这个反安装程序结束之前,这个uninstall.exe就被删除了。难度是这个反安装程序有调用了另外一个地方的程序删掉自己的??如果是直接在程序里面删除自己的话,可是这时程序正在执行啊。请问是怎么回事?
...全文
384 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
penu 2003-02-20
  • 打赏
  • 举报
回复
安装包有几种,微软提供并推荐的是msi安装方式。
wenyongjie 2003-02-20
  • 打赏
  • 举报
回复
贴篇文章给你,希望对你有所帮助.
监视程序的编制
  监视程序,这个名字听起来似乎很陌生。它的用途主要是在后台监视系统中关键信息的改变,比如注册表的改变及硬盘上由于文件操作引起的改变等等。
  也许有人会问了,编制这样的程序有什么价值呢?硬盘上文件改变了,我只要在资源管理器里点一点不就全都清楚了吗?问题当然不会这样简单,如今大家的硬盘都已经用G来做单位了,一块4.3G的硬盘中,大大小小的文件全都加起来也会有若干万(相信新购机的朋友会考虑IBM10.1G的大硬盘,那文件数量将更加不可想象),更何况那些看不见的系统文件和隐藏文件了。再加上注册表,那其中的条条款款,数量也丝毫不逊于硬盘上的文件。要想随时知道自己机器是否有所变动,绝对不是一件很轻松的事。而监视程序就可以随时检测到这些变化,帮助我们了解这些情况。
  当然这只是监视程序的一部分作用,它最大的作用就是可以记录下某个软件安装前后系统的改变,从而为卸载这个软件提供重要的依据。虽然Windows自带了一个Uninstall Shield,但是它似乎并不能很干净地把原来的软件卸掉,每次卸载总会留下一些讨厌的残渣,致使系统中的垃圾信息不断增长,我们的硬盘空间也总是莫名其妙地越用越少。因此,一些号称能够完全卸载软件的专用卸载工具应运而生。在这其中,有一些就运用了监视系统的技术,比如Uninstaller Manager和RegMonitor。
  下面我们开始讨论如何编程实现这一监视功能。首先介绍几个重要的api函数:
  FindFirstChangeNotification( );
  FindNextChangeNotification( );
  WaitForSingleObject( );
  其中FindFirstChangeNotification(lpzpath,fwatchsubtree,fdwfilter)中的lpzpath表示要监视的路径名,fwatchsubtree判断是否查看子目录,fdwfilter为要监视的事件,函数执行成功后返回一个句柄。
  参数fdwfilter取值及其含义如下:
  FILE_NOTIFY_CHANGE_FILE_NAME  查看指定目录下任何文件名的改变
  FILE_NOTIFY_CHANGE_DIR_NAME  查看指定目录下任何目录名的改变
  FILE_NOTIFY_CHANGE_SIZE  查看指定目录下文件大小的改变
  FILE_NOTIFY_CHANGE_ATTRIBUTES  查看指定目录下文件属性的改变
  FindNextChangeNotification(hchange),hchange为FindFirstChangenNotification返回的句柄,其作用是请求系统
在下次检测到相应改变时发出改变通知消息句柄。当函数成功返回后,应用程序可通过WaitForMultipleObjects或WaitfForSingleObject来等待发生改变的通知。WaitForSingleObject(hchange,dwmilliseconds)中hchange为FindFirstChangeNotification 返回的句柄,dwmilliseconds为等待时间值,指定等待完成需要的时间,单位为毫秒。该值为-1时表示时间无限长。最好在结束监视程序之前先用FindCloseChangeNotification(hchange)来关闭句柄。
  下面给出一个简单的实例,其功能就是监视c:\pwin98目录下是否有文件发生变化。一旦有重命名、创建或删除情况发生时,通过Edit控件给出提示。
  //
  ----------------
  #include
  #pragma hdrstop
  
  #include “Unit1.h”
  //----------------
  #pragma package(smart_init)
  #pragma resource “*.dfm”
  TForm1 *Form1;
  //-----------------
  __fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
  {
  }
  //-------------------
  
  void __fastcall TForm1::FormCreate(TObject *Sender)
  {
  DWORD dwWaitStatus;
  HANDLE dwChangeHandle; //返回通知的句柄
  dwChangeHandle=FindFirstChangeNotification(
  “C:\\PWIN98”,false,FILE_NOTIFY_CHANGE_FILE_NAME); //设置返回通知的句柄
  if(dwChangeHandle==INVALID_HANDLE_VALUE)
  //判断是否设置成功
   ExitProcess(GetLastError( ));
  while(true){ //设置循环,监视是否有
  dwWaitStatus=WaitForSingleObject(dwChangeHandle,-1); //通知返回
  switch(dwWaitStatus){
  case 0:
  Edit1->Text=“Something Changed”; //给出提示
  FindCloseChangeNotification(dwcChangeHandle); //关闭句柄
  exit(EXIT_SUCCESS); //退出程序
  default:
  ExitProcess(GetLastError( ));
  }
  }
  }
  程序在C++Builder4/PWin98下通过,由于C++Builder语言很标准,所以很容易扩展到其他编程语言环境中去。
  此例说明如何监视硬盘中文件变化,对于注册表,则有函数RegNotifyChangeKeyValue( )可以实现类似功能,这里暂省略之。
  怎么样,看过本文,是否对Uninstaller Manager和Reg Monitor这样的软件有了更深入的了解。在Windows编程中,有些API函数起到了重要的作用,可以让程序实现很多高级的功能。因为API函数是按照C语言语法给出的,所以C++Builder有着得天独厚的优势,对API函数和宏支持得非常好。不好,怎么跑题了?
  还愣着干吗,难道你还不想赶快动手编制一个自己的Uninstaller Manager吗?

caimouse 2003-02-20
  • 打赏
  • 举报
回复
安装程序是怎写的呢?
用CB能写一个安装程序吗?
huang_jihua 2003-02-19
  • 打赏
  • 举报
回复
同意 myy()
penu 2003-02-19
  • 打赏
  • 举报
回复
TO:kingcaiyao(AKing)
你所说的只是卸载机制的一种,
一些打包软件的卸载机制不是这样的。
有的用install/uninstall.log记录安装信息,卸载时根据该信息进行反向操作。
还有的用批处理。
cscer 2003-02-19
  • 打赏
  • 举报
回复
自杀程序:

#include <windows.h>

int main()
{
char buf[MAX_PATH];
HMODULE Hm1,Hm2;
HANDLE Ex,De,Un,aaa;
Hm2=GetModuleHandle(0);
GetModuleFileName(Hm2,buf,255);
Hm1=GetModuleHandle("Kernel32");
Ex=GetProcAddress(Hm1,"ExitProcess");
De=GetProcAddress(Hm1,"DeleteFileA");
Un=GetProcAddress(Hm1,"UnmapViewOfFile");
aaa = (HANDLE)4;
CloseHandle(aaa);
__asm {
LEA EAX,buf
PUSH 0
PUSH 0
PUSH EAX
PUSH Ex
PUSH Hm2
PUSH De
PUSH Un
RET
}
return 0;
}
kingcaiyao 2003-02-19
  • 打赏
  • 举报
回复
其实每一个提供安装与卸载的软件,在软件的安装过程中,对注册表进行写操作,其中在这些写操作过程中就写下了该软件卸载时用到的文件,经常软件安装完后会看到一个.isu文件,这个文件就记录了软件安装过程所进行的操作,由_ISDEL.exe来进行卸载。
myy 2003-02-19
  • 打赏
  • 举报
回复
最简单的:在程序中生成一个a.bat,内容:

del xxxxx.xxx
del yyyyy.yyy
del dbchsb.zzz
; ...
; 其他想干的事
; ...
del %0(这行末不能有回车!!!)

再在程序退出时调用 a.bat
kingfish 2003-02-19
  • 打赏
  • 举报
回复
卸载具体怎么做的不清楚。

但运行程序是可以删除自己的,搜索“程序自杀”,
l_clove 2003-02-19
  • 打赏
  • 举报
回复
应该不是自己删自己,可以这么做,但我认为不是,可能是windows做的
penu 2003-02-19
  • 打赏
  • 举报
回复
大部分反安装程序正如你所说,则调用另一个地方的程序删掉自己的;

有一些不是由打包程序生成的而是软件作者自己手工打造的则可能用了自杀技术来删除自己,这种情况下一般你会发现软件所在目录没被删除。

当然软件目录没被删除原因有很多,如目录中有软件安装后又新增的文件,反安装程序有BUG等。
Bird1945 2003-02-19
  • 打赏
  • 举报
回复
好象WNNT下(2000)有个UNINSTALL程序.

大家找找看有没有.
InsPro Disk 绝对虚拟硬盘软件 虚拟硬盘软件,虚拟出的硬盘与真实硬盘一样可以进行分区、格式化等操作。 我经常在做数据恢复过程中用到它,比如以前要使用easy recovery,recovery my files等扫描工具 恢复 镜像文件上的数据,但这几款软件又不支持镜像文件的扫描,就要用到InsPro Disk把文件虚拟成磁盘,然后就可以用那些软件扫描了 。功能强大吧,用到的地方也蛮多的,值得收藏。而且操作界面也很简单也有说明,就不做多介绍了。 使用方法: 用InsPro Disk Creator创建磁盘镜像. 实际生成的文件大小会有调整. 请确保硬盘上空闲空间至少有63MB. 如果需要100M的虚拟硬盘, 则要确认有163M的空闲空间. 用InsPro Disk Loader来加载硬盘. 此时您可以用PARTITION MAGIC或者WINDOWS自带的工具分区, 格式化. 如果已经有分区, 会自动加载. 用InsPro Disk Loader来卸载硬盘. 选中已经存在的SLOT. 然后点LOAD/UNLOAD, 稍等片刻就会卸载对应的硬盘. 加载/卸载InsPro Disk时请注意InsPro Disk Loader的标题栏变化. 操作完成后标题栏恢复到最初状态. 安装方法: InsPro Disk不是为菜鸟准备的工具. 您如果不熟悉设备管理器的一些基本操作, 不建议您玩INSPRO DISK. 因为您将很难安装程序. 将所有的InsPro Disk用InsPro Disk Loader卸载. 打开设备管理器. (从我的电脑->属性->硬件->设备管理器或者其他什么途径随你便) 在系统设备栏中找到Inside Programming SECU-X BUS, 又键单击. 选择UNINSTALL. 到 系统盘:\Program Files\InsPro目录, 全删除. 到 系统盘:\windows(winnt)\system32\drivers目录, 删除SDBUS.SYS和SDDISK.SYS

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧