用delphi 写的一个单位小程序(Doctor.exe),只有一个EXE文件。由于要经常去更新这个程序,所以就需要一个程序来更新。
由于这delphi 写的Doctor.exe没有Dll. 因此就用一个引导程序(MyUp.exe)来完成这个更新的任务。
程序实施细则:
1. 读取本地INI文件,取得版本号Ver;(GetLocalIni)
function TForm1.GetLocalIni: integer; var myinifile:Tinifile; begin myinifile:=tinifile.Create(StrExePath+'AutoUpdate.ini'); result:=myinifile.ReadInteger('ver','newver',0); myinifile.Destroy ;
end; |
2.读取中心数据库,取得版本号(GetCenterIni);
function TForm1.GetCenterIni: integer; begin with qrytemp do begin close; sql.Clear ; sql.Add('select * from tblwqsverup where isuse=1'); open; edip.Text :=fieldbyname('Centerip').AsString ; edname.Text := fieldbyname('Ftpuser').AsString ; edpass.Text := fieldbyname('FtpPass').AsString ; edport.Text := fieldbyname('FtpPort').AsString ; result:=qrytemp.fieldbyname('verID').AsInteger ; close;
end; end; |
程序中下载采用FTP方式。所以把FTP的IP,user,password等相关信息一起放在机房的数据库中,也就一起读出放在窗体中的Edit中。让程序后来使用。
为了防止重复打开主程序(Doctor.exe),我采用在启动引导程序(MyUp.exe)时,先检查是否有主程序(Doctor.exe)进程存在,如果没有,才进行检查、更新和引导主程序的工作。
procedure TForm1.ExameExeRunED:boolean; begin strCurrentDir:=ExtractFilePath(paramstr(0)) ; strExe:= str1+strMainExe; //strMainExe程序名
if not ProcedureIsExists(strMainExe) then //进程不存在则打开它 begin if not FileExists(strExe) then begin ShowMessage('程序文件不在当前目录,请与系统管理员联系!'); Exit; end; if WinExec(PChar(strExe),SW_HIDE) <=31 then begin ShowMessage('程序运行错误!'); Exit; end ; end else ShowMessage(' is open!');
close;
//if ShellExecute(0, nil, PChar(strExe), nil,nil,SW_NORMAL)<=31 then // edit1.Text :='Error' else close; end;
function TForm1.ProcedureIsExists(AppName: string): Boolean; var lppe: TProcessEntry32; ssHandle:THandle; AppFound,findqq:Boolean; Wnd:HWND; begin Result:= False; ssHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPALL,0); lppe.dwSize:=SizeOf(lppe); AppFound:=Process32First(sshandle,lppe); while AppFound do begin //其中lppe.szExefile就是程序名********************************************** if UpperCase(ExtractFileName(lppe.szExeFile))=UpperCase(AppName) then begin Result:= True; Exit; end; AppFound:= Process32Next(ssHandle,lppe); end;
end; |