faint ~~~~~~现在才看到这个贴子浮出来:
下边是你要的东东
有三种特殊方法可以使程序完成自升级
1. 批处理文件法。 在主程序中调用另一个程序.此程序经过延时(等待主程序关闭,释放内存后),生成一个批处理文件.然后主程序关闭,然后运行批处理
批处理文件中写
delete main_exe.exe
ren update_exe.exe main_exe.exe
delete %0 //删除自己.(批处理文件自删除)
2. 主程序将自己改名为 main_exe.old
然后将 update_exe 改为 main_exe.exe
后一法最简单. 却容易被人忽视.
附加说明:
Windows NT 有一个函数 MoveFileEx 可以在重新启动后删除文件(参数MOVEFILE_DELAY_UNTIL_REBOOT) 但是, Windows 9x 不支持这个标志
每次我们重新启动机器后, Windows自动在Windows目录中寻找一个叫 WININIT.INI 的文件.这个文件可以包含删除,改名,COPY文件的操作. 所以我们可以放置 'DESTINATION=SOURCE'字符串在[Rename] 区
. 如果 Destination 设置为 NUL, 那么 Source 文件将被删除. 注意此操作中文件名必须是短格式文件名
(因为此操作的加载是在 系统加载长文件名支持前完成的)
举例:
[rename]
NUL=C:/TEMP.TXT
NUL=C:/TEMP2.TXT
C:/NEW_DIR/EXISTING.TXT=C:/EXISTING.TXT
C:/NEW_DIR/NEWNAME.TXT=C:/OLDNAME.TXT
C:/EXISTING.TXT=C:/TEMP/NEWFILE.TXT
下面是一个函数, 演示如何进行上述操作. 此函数添加 NUL=FileName 到Wininit.ini.如果Wininit.ini
不存在.这个函数会自动建立它.
procedure DeleteLater(Filename: string);
var
Wininit : string;
Buffer : array[0..MAX_PATH] Of char;
I,J : integer;
Ini : TStringList;
begin
FillChar(Buffer, SizeOf(Buffer), 0);
GetWindowsDirectory(Buffer, SizeOf(Buffer));
Wininit := IncludeTrailingBackslash(Buffer) + 'Wininit.ini';
Ini := TStringList.Create;
try
if FileExists(Wininit) then
Ini.LoadFromFile(Wininit);
for I := 0 to Ini.Count - 1do
Ini := Uppercase(Ini);
J := Ini.IndexOf('[RENAME]');
if J = -1 then
begin
Ini.Add('[Rename]');
J := 0;
end;
FillChar(Buffer, SizeOf(Buffer), 0);
GetShortPathName(PChar(Filename), Buffer, SizeOf(Buffer));
Ini.Insert(J+1, 'NUL=' + Buffer);
Ini.SaveToFile(Wininit);
finally
Ini.Free;
end;
end;