如何检查是否有一个使用给定句柄运行的进程

时间:2015-05-09 15:13:43

标签: delphi executable handle auto-update

方案: 从App1,我需要执行App2传递App1.Handle作为参数。 App2应该等到App1关闭。在此之后,App2应该用更新版本替换App1.exe文件。

  • 有更好的方法来更新正在运行的可执行文件吗?
  • 如果还没有..在App2中,我知道App1.Handle,我应该检查 如果App1已经关闭。如何从此开始验证 App1.Handle?

编辑:

App1的:

var
  SenderHandle : THandle;
begin
  if(ParamStr(1) <> '') then
  begin
    SenderHandle := StrToInt(ParamStr(1));
    WaitForSingleObject(SenderHandle, INFINITE);
    ShowMessage('App1 Terminated!');
    //Showmessage is executed when App1 is still running, what's wrong?
  end;
end;

App2的:

public function getCategory(){
    $query = mysql_query("SELECT * FROM category");
    $category = array();
    for($i=0; $i < mysql_num_rows($query); $i++){
        $row = mysql_fetch_array($query);
        $temp = array(
            'cat_id'=>$row['cat_id'],
            'cat_name' =>$row['cat_name'],
            'sub_cat' =>$this->getSubCategory($row['cat_id'])

        );
        $category[$i] = $temp;
    }
        return $category;
}

public function getSubCategory($cat_id){
    $sql = "Select * from sub_category where cat_id=".$cat_id." ";
    $query = mysql_query($sql);
    $sub_cat = array();
    for($i=0; $i < mysql_num_rows($query); $i++){
        $row = mysql_fetch_array($query);
        $temp = array(
            'subcat_id'=>$row['subcat_id'],
            'cat_id'=>$row['cat_id'],
            'sub_cat_name' =>$row['sub_cat_name']
        );
        $sub_cat[$i] = $temp;
    }
        return $sub_cat;
}

2 个答案:

答案 0 :(得分:3)

App1.Handle表示窗口句柄。 App2需要等待App1的进程句柄。要获取App1的流程处理,请使用OpenProcess()作为进程ID,GetCurrentProcessId()使用DuplicateHandle()作为源句柄。然后,您可以将句柄传递给App2,并让App2使用GetCurrentProcess()等待它。当App1退出时,手柄将发出信号。然后App2可以关闭句柄并替换App1.exe。

答案 1 :(得分:-1)

为什么要等待进程使用PID终止?为什么不尝试覆盖该文件?只要进程仍在运行,就无法覆盖.EXE文件。

IE中。类似的东西:

WHILE NOT CopyFile(NewVersion,InstalledVersion) DO Sleep(100);

当然你可以加入超时和其他安全措施,但上面显示了另一种方法,无需PID或其他值来测试......