碰到了点挑战,大鸟们能不能帮助解决。(100)

  • 主题发起人 主题发起人 chenzhihui
  • 开始时间 开始时间
C

chenzhihui

Unregistered / Unconfirmed
GUEST, unregistred user!
先举例描述我的问题:1.this.exe是我的主程序。upVersion.exe这个程序的作用呢是上传this.exe这个程序到数据库,我建了一个表用blob字段存放this.exe文件。2.PupVer.exe这个程序的作用是,主程序this.exe在运行的时候,使用PupVer.exe来去数据里看看,根据版本号判断有没有更新的程序需要下载。如有有更新的版本。下载覆盖this.exe3.在this.exe的program单元中调用PupVer.exe的代码如下。program PeriorMgr;uses Forms, SysUtils, Windows,IniFiles, configMgr in 'configMgr.pas' {FrmConfigMgr} .. ..;Var Fn : String; TSI : TStartupInfo; TPI : TProcessInformation; confile:TIniFile;{$R *.res}begin Fn:= ExtractFilePath(ParamStr(0))+'PupVer.exe'; FillChar(TSI, SizeOf(TSI), 0); TSI.CB := SizeOf(TSI); //函数只负责生成进程.而不关心执行了结果. (1) IF CreateProcess (PChar(Fn), NIL, NIL, NIL, False,DETACHED_PROCESS, NIL, NIL, TSI, TPI) THEN begin messagebeep(0); end ELSE Begin messagebeep(0); Application.MessageBox('不能完成文件拷贝.'+'请手工拷贝!.', 'Copy Error!',1); Exit; End; //this.exe的主程序 (2) Application.Initialize; Application.CreateForm(TFrmConfigMgr, FrmConfigMgr); Application.CreateForm(TFrmlogin, Frmlogin); Application.Run;end.我的初衷是PupVer.exe运行成功正确之后(应为用vpn连接数据库比较耗时)。也就是从库中下载到this.exe之后。然后this.exe再开始运行。看符号(1)和(2)处。我在调试的时候,发现(1)处的程序PupVer.exe运行之后,(2)处的程序this.exe也开始运行拉。而PupVer.exe运行比较耗时,它还没有更新this.exe成功。个人感觉(1)处 IF CreateProcess (PChar(Fn), NIL, NIL, NIL, False,DETACHED_PROCESS, NIL, NIL, TSI, TPI) THEN 函数只负责打开一个进程。进程正常打开了就算成功了。这个函数有没有其中一个参数返回?我可以在PupVer.exe工程中对他赋值,表示已成功,让函数返回这个值。还有什么其他的方法。也就是想实现PupVer.exe先下载。下载成功以后拉。this.exe在执行。。应为Application.Initialize还没有初始化,这样运行的就是新的程序。渴望大鸟们指点一下。送100分。有源代码最好不过了。
 
新建一个更新小程序,做为主程序,调用'PupVer.exe'更新程序, 下载更新完之后, 再调用this.exe程序(真正的主程序),然后把自己(更新小程序)结束. procedure TFrm_AutoUpdate.FormCreate(Sender: TObject);var FileOp: TSHFileOpStruct; sCurPath, sFrom, sTo : String; List : TStrings; iRet : Integer; sError : string; Frm_UpdateLogo : TFrm_UpdateLogo;begin Fn:= ExtractFilePath(ParamStr(0))+'PupVer.exe'; if DD(Fn, False) = -1 then //等待更新完成 begin MessageBeep(0); Application.MessageBox('不能完成文件拷贝.'+'请手工拷贝!.', 'Copy Error!',1); Exit; end; WinExec(PChar('this.exe'), 1); //调用主程序 Application.Terminate; //结束自己 end;function DD(FileName: string; Visible: Boolean): integer;var sAppName: array[0..512] of char; StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; iExitCode: Dword; iShow: integer;begin StrPCopy(sAppName, FileName); FillChar(StartupInfo, Sizeof(StartupInfo), #0); StartupInfo.cb := Sizeof(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; if Visible then iShow := 1 else iShow := 0; StartupInfo.wShowWindow := iShow; if not CreateProcess(nil, sAppName, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then Result := -1 else begin WaitforSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, iExitCode); result := iExitCode; end;end;
 
这不是两个程序嘛,你这样写当然是两个同时运行了应该用WaitForSingleObject等待更新程序(PupVer.exe)运行完了,再执行下面的操作就行了
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
899
SUNSTONE的Delphi笔记
S
后退
顶部