Program.exe と updater.exe の 2 つのアプリがあり、どちらも Delphi5 で記述されています。プログラムは管理者権限なしで (およびマニフェストなしで) 実行されます。アップデーターには「requireAdministrator」のマニフェストがあります。
問題は、アップデーターを起動して、プログラムが閉じられるまで彼を待たせることです。ウェブでさまざまな方法を見つけましたが、どれも機能しません (ほとんどの場合、最初のアプリは 2 番目のアプリを開始し、2 番目のアプリの終了を待ちます。私の場合、2 番目のアプリは 1 番目のアプリの終了を待つ必要があります)。
アップデータは待つ必要があります。それは簡単
です updater.exe
{$R manifest.res}
label.caption:='Wait for program.exe closing';
repeat
sleep(1000);
until File is not open
ProgramHandle := Read Handle from File
WaitForSingleObject(ProgramHandle,INFINITE);
label.caption:='program.exe CLOSED';
Do updates
方法 1
CreateProcess:
program.exeでアップデーターを起動する
FillChar(siInfo, SizeOf(siInfo), 0);
siInfo.cb := SizeOf(siInfo);
saProcessAttributes.nLength := SizeOf(saProcessAttributes);
saProcessAttributes.lpSecurityDescriptor := nil;
saProcessAttributes.bInheritHandle := TRUE;
saThreadAttributes.nLength := SizeOf(saThreadAttributes);
saThreadAttributes.lpSecurityDescriptor := nil;
saThreadAttributes.bInheritHandle := True;
if CreateProcess(nil,
PChar('updater.exe'),
@saProcessAttributes,
@saThreadAttributes,
TRUE, NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(Application.ExeName)),
siInfo, piInfo) then
begin
DuplicateHandle(GetCurrentProcess, GetCurrentProcess,
piInfo.hProcess, @MyHandle,
PROCESS_QUERY_INFORMATION, TRUE,
DUPLICATE_SAME_ACCESS) then
Write MyHandle in a File
end;
Close program
何もせず、requireAdministrator を含むマニフェストがアップデーターにない場合にのみ機能します。Explizit 管理者権限でプログラムを実行すると、それも機能します。
方法 2 ShellExecuteEx:
program.exeでアップデーターを起動する
FillChar(Info, SizeOf(Info), Chr(0));
Info.cbSize := SizeOf(Info);
Info.fMask := SEE_MASK_NOCLOSEPROCESS;
Info.lpVerb := PChar('runas');
Info.lpFile := PChar('update.exe');
Info.lpDirectory := nil;
Info.nShow := SW_RESTORE;
ShellExecuteEx(@Info);
MyHandle:=OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessId())));
Write MyHandle in a File
Close program
MyHandle は、この手順を実行するたびに (プログラムを再起動せずに) 異なる値を持つため、アップデーターはそれを操作できません。
そのため、updater.exe を起動して、program.exe のハンドルをファイルに書き込む方法がわかりません。
私はプログラミングのこれらの部分にあまり詳しくありません...誰かが私の問題についてアイデアを持っていますか?