关于程序自杀问题

xyzhao 2000-02-23 01:47:00
我正在编一个安装和反安装程序,需要一个正在运行的程序把自己从硬盘里删除,请问有谁知道如何实现。
...全文
859 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
Star 2000-02-29
  • 打赏
  • 举报
回复
netmare,已经试过了,NT/9X均通过。
netmare 2000-02-28
  • 打赏
  • 举报
回复
to Star:
原来如比,试过吗,可以吗?
zqy 2000-02-28
  • 打赏
  • 举报
回复
做一个比较小巧的的程序放在Window目录里,在程序退出时启动他.
反正Window目录本来就是一个垃圾桶.
我的Window目录里就有好几个"uninst.exe","Unwise.exe"等等,
相信你的也有不少.
Star 2000-02-28
  • 打赏
  • 举报
回复
呵呵,那个进程文件先用FILE_FLAG_DELETE_ON_CLOSE在原进程打开,
原进程退出时CloseHandle即可。
netmare 2000-02-28
  • 打赏
  • 举报
回复
但是那另一个进程又怎么DeleteFile它自己呢
Star 2000-02-28
  • 打赏
  • 举报
回复
WHQ你是说我吗?
你的方法我试过了,确实不行的,我当然有本机的管理员权限。
不过从你的意见我想到一个途径可以不利用Bat文件实现自删除功能,
就是另起一个进程DeleteFile自己,已经通过了(NT&98)。
AP 2000-02-25
  • 打赏
  • 举报
回复
请参考一下:
Delphi 1 编写的程序可以很容易把自己删除,程序不用退出而且可以继续运行。
但是 Delphi 3,Delphi 5 编写的程序不行。
WHQ 2000-02-25
  • 打赏
  • 举报
回复
你用的是NT吧,你登录的用户是否用此权限呢?我是用Administrator登录的
Star 2000-02-25
  • 打赏
  • 举报
回复
嗯试过了,Fancy的方法是可行的,可以在bat文件
的最后加上del %0.bat来实现bat文件的自删除。
flywind 2000-02-25
  • 打赏
  • 举报
回复
编一个安装和反安装程序,其实在下次启动时删除,就行了!(在注册表中写键值—)
用Bat文件的方式不太好,又留下垃圾了!
teeegg 2000-02-24
  • 打赏
  • 举报
回复
1.最简单的做法:
你的程序名为:dd.exe
做一个批处理文件:cc.bat
内容为:
@echo off
dd
del dd.exe
del %0
执行cc.bat就行了。


2.一般大家的做法:
应用程序结束时在下次启动是埋下伏笔,
在启动时启动一个名叫cc.bat的文件,内容为:
@echo off
if dd.exe exist then
del dd.exe

del %0

这个文件可以放在注册表中的run、runservice;
可以放在autoexec.bat、config.sys;
可以放在wininit.ini、
可以放在“程序”里的“启动”里,
可以放在win.ini的Run里......
很多很多啊!


3.专业安装程序InstallShield Express 是调用Windows目录下的UnInstall.exe程序,
通过".ISU"文件来卸载的.
UnInstallShield(UnInst.exe)的使用方法:
uninst.exe -f加卸载文件(*.isu没有空格).
例: c:\windows\uninst.exe -fd:\cc\deisl1.isu

deisl1.isu是InstallShield生成的二进制的log文件, 内容是装配的文件
以及注册表纪录等等.
如果同一个软件安装了第二次, 生成DeIsl2.ISU; 第三次为DeIl3.ISU等等等等。
Magician 2000-02-24
  • 打赏
  • 举报
回复
就是我说的写入\Windows\Wininit.ini文件,然后Windows重启动的时候会改名或删除.但是必须有第二个进程,不然的话,不能立刻删除主程序所在的目录.实际上,绝大多数反安装程序都是这样做的,包括MS.
fupf88 2000-02-24
  • 打赏
  • 举报
回复
无论怎样删去,事实上都是先关闭主进程再用另起的进程或线程(用线程有一定的危险性)来删。好象有一个拷贝文件的函数,可以设置为当时不覆盖,重启后再覆盖的,记不清了,去查查吧
jamesw 2000-02-24
  • 打赏
  • 举报
回复
Windows 95/98: The MoveFileEx function is not supported. To rename or delete a file at reboot, use the following procedure.

To rename or delete a file on Windows 95/98

Check for the existence of the WININIT.INI file in the Windows directory.
If WININIT.INI exists, open it and add new entries to the existing [rename] section. If the file does not exist, create the file and create a [rename] section.
Add lines of the following format to the [rename] section:
DestinationFileName=SourceFileName
Both DestinationFileName and SourceFileName must be short file names. To delete a file, use NUL as the value for DestinationFileName.

The system processes WININIT.INI during system boot. After WININIT.INI has been processed, the system names it WININIT.BAK.

longx 2000-02-24
  • 打赏
  • 举报
回复
为什么这样做?-:)
既然反安装,那就应该让运行着的程序停下来。
要吗你的反安装程序发消息让运行的程序停下来,
要吗强行KIll掉.
netmare 2000-02-24
  • 打赏
  • 举报
回复
我自己测试的程序其实是这样写的:
char szFileName[_MAX_PATH];
GetModuleFileName(NULL, szFileName, _MAX_PATH);
FILE *fp=fopen("e:\\t.bat","w+");
fprintf(fp,"del %s\ndel e:\\t.bat",szFileName);//最好能再加个延时之类的就更好了
fclose(fp);
ShellExecute(NULL,"open","e:\\t.bat",NULL,"e:\\",SW_HIDE);
ExitProcess(0);//立即结束进程
所以即使没有延时,也能通过,当然这样不太稳定
bclzi 2000-02-24
  • 打赏
  • 举报
回复
使用批处理
在你的主程序里使用写的方法做一个批处理文件(在程序要结束的时候,即批处理文件写完后就推出程序)而在这个批处理文件里,可以删除exe文件.
bat1.bat

main.exe
//此处有个循环:检查bat2.bat是否存在,如果存在则执行,若不存在则空循环
//因为在windows下是多任务的,不能保证程序执行的先后,所以不可以以简单的批出理来//解决因为本人对 dos已经不那么热中,所以批处理也忘的查不多了,只知道有这么个批//处理命令

^Z
bat2.bat

del main.exe
^Z
总之难点在于window的多任务
如果在dos下,基本上不需要什么陌生的批处理命令

shizzz 2000-02-24
  • 打赏
  • 举报
回复
我试了NETMARE和WHQ的方法,都不行,NETMARE的方法如果能在BAT文件中加上延时和循环也许可以,因为我可以删除BAT文件自己。WHQ的方法不行,执行CLOSEHANDLE(HFILE)后,关闭了文件HANDLE,程序还未CLOSE INSTANCE HANDLE,此时CREATEFILE已经在执行DELETE功能了。
再进一步,怎么删除自己所在的目录和他们的父目录?不须重启,象UNWISE一样。
gypb 2000-02-24
  • 打赏
  • 举报
回复
其实原理很简单:FOR DELPHI
程序反安装时产生一临时BAT文件
bat file
del filename //要删除的文件名
del %0 //不要回车,作用是删除BAT文件自己

在反安装程序结束时执行WINEXEC(BATFILE,SW_HIDE);
最好将上式代码加入程序退出时执行。

shizzz 2000-02-24
  • 打赏
  • 举报
回复
我使用NETMARE和WHQ的方法,都不行,NETMARE的方法如果在BAT文件中加循环和等待,也许可行但能在BAT文件中能加等待吗?现在我只能删除BAT文件自己。WHQ的方法好象更本不行,CLOSEHANDLE(HFILE)关闭的是文件HANDLE, 此时还未关闭INSTANCE HANDLE, 而CREATEFILE已经在做DELETE工作了。

再进一步,能把自己所在的目录和他们的父目录KILL吗?不用重启,象Unwise一样。
加载更多回复(15)

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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