程序如何删除自己?(100分)

  • 主题发起人 主题发起人 barton
  • 开始时间 开始时间
B

barton

Unregistered / Unconfirmed
GUEST, unregistred user!
我正在做一个安装程序(有一些功能不能在InstallShield中实现,比如安装IB6),
所有的一切均没有问题,但最后在反安装时如何删除自己呢?是不是根本不可能删除?
 
看看以前的帖子吧,分数愿意的给一半就可以。
 
来自cAkk的解答,我测试有一些小问题 。

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
f:textfile;
begin
assignfile(f,'./delself.bat');
rewrite(f);
writeln(f,'@echo off');
writeln(f,':loop');
writeln(f,'del "'+application.ExeName+'"');
writeln(f,'if exists "'+application.exename+'" goto loop');
writeln(f,'del ./delself.bat');
closefile(f);
winexec(pchar('./deself.bat'), SW_HIDE);
close;
end;
 
在系统重新启动时删除自己的C++例子:
//在WINDOWS系统目录下,建立一个WININIT。INT文件,里面的内容为:
//[rename]
//NUL=c:/temp/aaa.txt
//以上为要删除的文件名
//删除之后,再删除这个INI文件即可。
//// 系统重新启动时删除一个文件(适用于9X和NT)//
BOOL DeleteFileUntilReboot( LPCTSTR szFileName )
{
#define RENAME_SEC _T("[rename]")
#define WININIT_INI _T("WININIT.INI")
////////////////////////////////////////////////////////////
// 在系统重新启动时,把文件删除
DWORD dwVersion = ::GetVersion();
// Windows NT
if (dwVersion < 0x80000000)
return MoveFileEx( szFileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT );
// wininit.ini文件路径
TCHAR szWinInitFile[MAX_PATH];
TCHAR szTmpFile[MAX_PATH];
GetWindowsDirectory( szWinInitFile, MAX_PATH );
if ( _T('//') != szWinInitFile[ lstrlen(szWinInitFile)-1 ] )
lstrcat( szWinInitFile, _T("//") );
lstrcpy( szTmpFile, szWinInitFile );
lstrcat( szWinInitFile, WININIT_INI );
lstrcat( szTmpFile, S_TMP_FILE_NAME );
if ( 0xFFFFFFFF == GetFileAttributes( szWinInitFile ) ) {
// 该文件不存在,自己创建
// 95 or 98
// wininit.ini文件内容
CString sText;
sText.Format( _T("/n%s/nNUL=%s/n"), RENAME_SEC, szFileName );
try {
CStdioFile fileInit( szWinInitFile, CFile::modeCreate | CFile::modeWrite );
fileInit.SeekToEnd();
fileInit.WriteString( sText );
fileInit.Close();
} catch(...) {
return FALSE;
}
}
else {
// 该文件存在,则打开之,找到rename块添加之
DelFile( szTmpFile );
try {
CStdioFile fileS( szWinInitFile, CFile::modeRead );
CStdioFile fileT( szTmpFile, CFile::modeCreate | CFile::modeWrite );
CString sRead;
while ( fileS.ReadString( sRead ) )
{
sRead.TrimLeft();
sRead.TrimRight();
fileT.WriteString( sRead );
fileT.WriteString( _T("/n") );
if ( 0 == sRead.CompareNoCase( RENAME_SEC ) ) {
fileT.WriteString( _T("NUL=") );
fileT.WriteString( szFileName );
fileT.WriteString( _T("/n") );
}
}
fileT.Close();
fileS.Close();
// 用新创建的文件替换wininit.ini
DelFile( szWinInitFile );
MoveFile( szTmpFile, szWinInitFile );
}
catch(...) {
return FALSE;
}
}
return TRUE;
}
 
我下过一个例子程序,和wjiachun的答案差不多。可以结束了。 :)
 
To wjiachun:
Application.ExeName是一个带路径的文件名,如果这个路径或者文件名不符合DOS的命名
规则,在WIN 9X下就会报告错误,最好在程序里加上处理的代码,把规范的文件名或者目
录名改成DOS的83法则。
 
>> 我正在做一个安装程序(有一些功能不能在InstallShield中实现,比如安装IB6),
IS -> Dialog boxes -> Setup complete -> Setting
 
To wjiachun:
方法看起来可行。不过显然不是M$推荐的方法。
To 黄豆:
你的方法为什么不写成Pascal?似乎更象标准的方法。
To Victortim:
你这位大侠是什么意思?难道可以使用IS来实现?这倒很让人感兴趣。请详细一些。
我知道IS6.22可以加入ADO,BDE等数十个包,如何添加一个包?
 
请继续或结束
 
多人接受答案了。
 
后退
顶部