[正确就结贴]update是main的升级程序,main调用update以后,能从update中杀死main吗?
关于杀死主程序的问题。。。
我现在的困难如下:
我的main程序,用户在第一次运行以后,在main程序的最后一行,我call了update用来检测,当前main和update是否为最新版本的程序。update从网上http下载文件,成功的放置在临时文件夹,
UPDATE kill主程序,然后,使用文件移动函数,将main程序覆盖掉。
NOW,
现在的问题是,如果我单独的调用了我的update程序,就可以覆盖掉主程序,而如果我在主程序中使用winexec调用的update程序,就没有办法覆盖掉主程序。。。
所以求教。
如果在被调用的程序里 kill掉,调用他的程序,THX。
现在是kill函数的整个单元文件
unit KILLPRO;
interface
uses
tlhelp32,SysUtils,Windows;
procedure KillProgram(ExeName:string);
implementation
procedure KillProgram(ExeName:string);
var
ProcessLppe: PROCESSENTRY32;
WhetherProcessFound: Boolean;
ProcessHandler,hh: THandle;
begin
ProcessHandler := THandle( CreateToolhelp32Snapshot(TH32CS_SNAPALL,0) );
WhetherProcessFound := Process32First( ProcessHandler,ProcessLppe);
//---------Get SnapShot---------------------
ProcessHandler := THandle( CreateToolhelp32Snapshot(TH32CS_SNAPALL,0) );
//---------Get Process Hanle-----------------
while WhetherProcessFound do
begin
//----Compare list and Strings----------------
if AnsiCompareText(ExeName,ProcessLppe.szExeFile) =0 then
begin
hh := OpenProcess(PROCESS_ALL_ACCESS,true,ProcessLppe.th32ProcessID);
TerminateProcess( hh,0);
end;
WhetherProcessFound := Process32Next(ProcessHandler,ProcessLppe );
end;
end;
end.
[解决办法]
Project Main:
uses ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
var
sFilename : String;
begin
sFilename := 'Update.exe ';
ShellExecute(0, ' ', PChar(sFilename), PChar(sFilename), ' ', SW_SHOWNORMAL);
end;
Project Update:
uses TlHelp32;
procedure KillProgram(ExeName:string);
var
ProcessLppe : PROCESSENTRY32;
WhetherProcessFound: Boolean;
ProcessHandler, hh : THandle;
begin
ProcessHandler := THandle(CreateToolhelp32Snapshot(TH32CS_SNAPALL,0));
WhetherProcessFound := Process32First( ProcessHandler,ProcessLppe);
ProcessHandler := THandle(CreateToolhelp32Snapshot(TH32CS_SNAPALL,0));
while WhetherProcessFound do
begin
if AnsiCompareText(ExeName,ProcessLppe.szExeFile) = 0 then
begin
hh := OpenProcess(PROCESS_ALL_ACCESS, True, ProcessLppe.th32ProcessID);
TerminateProcess(hh, 0);
end;
WhetherProcessFound := Process32Next(ProcessHandler, ProcessLppe);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
KillProgram( 'Main.EXE ');
end;
[解决办法]
main调用ShellExecute函数执行update程序,然后马上Post一个退出消息给main的主窗口,如PostMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0); update程序启动后延时一两秒钟开始替换main程序的Exe文件。如果时间上还来不及的话,可以在main调用update时,带一个参数过去,就是main的进程句柄,update在运行后读取相应的命令参数,用TerminateProcess结束之。