关于杀死主程序的问题
我现在的困难如下:我的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.

解决方案 »

  1.   

    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;
      

  2.   

    Main中用ShellExecute来代替WinExec。
    以上代码已经通过测试了的。
      

  3.   

    main调用ShellExecute函数执行update程序,然后马上Post一个退出消息给main的主窗口,如PostMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0); update程序启动后延时一两秒钟开始替换main程序的Exe文件。如果时间上还来不及的话,可以在main调用update时,带一个参数过去,就是main的进程句柄,update在运行后读取相应的命令参数,用TerminateProcess结束之。
      

  4.   

    谢谢楼上两位,果然是时候不够
    因为在update程序中
    我kill了主程序  马上跟的就是movefile ,好象这样时间的确是不够现在kill主程序以后,马上sleep(1500);
    结果更新成功。多谢楼上两位给出的提示和启发。。结贴
      

  5.   

    关于postmessage
    因为我的主程序本身也是一个数据库系统的一个补丁,本身没有窗体。所以只好用kill