首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

[正确就结贴]update是main的升级程序,main调用update以后,能从update中杀死main吗?解决办法

2012-02-06 
[正确就结贴]update是main的升级程序,main调用update以后,能从update中杀死main吗?关于杀死主程序的问题。。

[正确就结贴]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结束之。

热点排行