关于杀死主程序的问题
我现在的困难如下:我的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);implementationprocedure KillProgram(ExeName:string);
var
ProcessLppe: PROCESSENTRY32;
WhetherProcessFound: Boolean;
ProcessHandler,hh: THandle;beginProcessHandler := 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.
我现在的困难如下:我的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);implementationprocedure KillProgram(ExeName:string);
var
ProcessLppe: PROCESSENTRY32;
WhetherProcessFound: Boolean;
ProcessHandler,hh: THandle;beginProcessHandler := 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.
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;
以上代码已经通过测试了的。
因为在update程序中
我kill了主程序 马上跟的就是movefile ,好象这样时间的确是不够现在kill主程序以后,马上sleep(1500);
结果更新成功。多谢楼上两位给出的提示和启发。。结贴
因为我的主程序本身也是一个数据库系统的一个补丁,本身没有窗体。所以只好用kill