我在做一自动更新程序,在更新前,如何关闭主程序?(100)

  • 主题发起人 主题发起人 hxiaomin888
  • 开始时间 开始时间
H

hxiaomin888

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我的自动更新程序为AutoUpdate.exe,如何检测主程序(Hr.exe)是否已打开 ,如果已打开,则关闭主程序Hr.exe,
 
这段代码是取得系统所有的进程名: var hCurrentWindow:HWnd;szText:array[0..254] of char; begin hCurrentWindow:=Getwindow(handle,GW_HWndFrist); while hCurrentWindow <> 0 do begin if Getwindowtext(hcurrnetwindow,@sztext,255)>0 then listbox1.items.add(strpas(@sztext)); hCurrentWindow:=Getwindow(hCurrentwindow,GW_HWndNext); end; end; 楼主可以修改一下,把所有的进程名一一比较是否是Hr.exe
 
可以使用FindWindow. 然后使用ClassName查找app的classname.
 
to HydonLee你的方法能否讲详细点呢?或者有没有demo
 
to de410假如hr.exe被用户改变了呢?这种方法是否就失效了?
 
给你一个简单的消息通讯的例子: 主程序(Hr.exe) unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TForm1 = class(TForm) procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean); begin if Msg.CharCode = VK_CONTROL then SendMessage(FindWindow(nil,'Form2'), WM_APP+1, 0,0); end; end. 更新程序AutoUpdate.exe: unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } public procedure WndProc(var Msg: TMessage); override; { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.WndProc(var Msg: TMessage); begin with Msg do begin if Msg = WM_APP + 1 then Form1.Caption := 'gggggg'; end; inherited; end; end.
 
能否通过主程序中的主窗体名frmMain来判断呢?请各位帮忙想想办法.
 
通过caption查找 Var H:HWND; lpClassName:PChar; begin H:=FindWindow(nil,'主窗体Caption,如**系统 '); // if H<>0 then begin lpClassName:=StrAlloc(30); GetClassName(H, lpClassName, 30); ShowMessage(StrPas(lpClassName)); //窗体类的名称 StrDispose(lpClassName); end; end;------------------------通过类名查找 Var H:HWND; lpClassName:PChar; begin H:=FindWindow('TfrmMain', nil); if H<>0 then begin lpClassName:=StrAlloc(30); GetClassName(H, lpClassName, 30); ShowMessage(StrPas(lpClassName)); //窗体类的名称 StrDispose(lpClassName); end; end;
 
其实不用这么复杂,一般情况自动更新程序AutoUpdate.exe是由hr.exe调用的,如果这样就简单了。可以把hr.exe的handle作为参数传递给被调用程序autoupdate.exe,autoupdate.exe下载完成后,发个消息给hr.exe让他关闭。几行代码就能完成你的要求了。
 
mainprogra.exe ->send then application.exename to autoupdate.exe ->egparam1 := applciation.exename;shellexecute (xxx,'autoupdate.exe' ,param1);in autoupdate.dpr get the first paramstr(1) ,then search main memory this name of process ,and termilate it,then run autoupdate main thread.
 
我做过一个实时网上自动更新升级的软件,因为是自己的主程序调更新程序,所以我用是传递参数的办法。比如A.EXE调UPDATE.EXE,参数就是A.EXE,所有无论谁调UPDATE.EXE,都将自己的进程名传过去,那么,如果A.EXE有更新,则直接将它杀掉,更新完了,再打开就OK了。
 
最简单得跟新思路,用了多年也不出错: 1. A为主程序,判断是否需要跟新(读取远程标志) 2. If 需要跟新 Then WinExec(B.EXE,...); A.exe自己结束程序! 3. B.EXE稍微等待5秒,从远程服务段跟新A.EXE
 
wql和我用的方法一样,不过从网络升级的代码是在主程序里实现的,升级程序只是实现了本地文件更新的功能:unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,shellAPI, ExtCtrls;type TForm1 = class(TForm) Label1: TLabel; Timer1: TTimer; procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } i:integer; procedure MyPro; end;var Form1: TForm1;implementation{$R *.dfm}function GetExePath:String;{该函数用于取得当前应用程序所在的路径}begin Result:=ExtractFilePath(ParamStr(0)); if Result[Length(Result)]<>'/' then Result:=Result+'/';end;procedure TForm1.MyPro;var OldFile,NewFile,BakFile:string;begin OldFile:=GetExePath+'digital.exe'; NewFile:=GetExePath+'DGJ.exe'; BakFile:=GetExePath+'digital_bak.exe'; if findwindow('TApplication','数码冲印大管家(网络版)')<>0 then//我这里检查主程序用了查找应用程序名称的方法,不可靠,可用全局原子的方法来检查。 begin label1.Caption:='正在关闭主程序...'; sleep(1000); Application.ProcessMessages; end; label1.Caption:='正在更新主程序!'; if FileExists(NewFile) then begin if FileExists(BakFile) then DeleteFile(BakFile); try RenameFile(OldFile,BakFile); RenameFile(NewFile,OldFile); except showmessage('更新失败!'); end; end; label1.Caption:='正在重新启动主程序!'; ShellExecute(handle,nil,pchar(OldFile),nil,nil,SW_SHOWNORMAL); Close;end;procedure TForm1.FormShow(Sender: TObject);begin Timer1.Enabled:=true;end;procedure TForm1.Timer1Timer(Sender: TObject);begin inc(i); if i>3 then begin Timer1.Enabled:=false; MyPro; end;end;procedure TForm1.FormCreate(Sender: TObject);begin i:=0;end;end.
 
后退
顶部