関連するすべてのソース ファイルを添付せずに、できるだけ簡潔にしようと思います。Pascalの知識が許す限り、問題を追跡しました...
私の場合、ステップssInstallで発生するディスクキャッシングの問題を発見したと思います。古いバージョンのアプリがインストールされていることがわかった場合、次のようなアンインストールを呼び出すアプリのインストーラーがあります。
procedure CurStepChanged(CurStep: TSetupStep);
var
uninstallStr: String;
ResultCode: Integer;
begin
if (CurStep = ssInstall) and IsUpdatableApplicationInstalled() then
begin
uninstallStr := GetUninstallString();
uninstallStr := RemoveQuotes(uninstallStr);
Result := Exec(uninstallStr, '/SILENT /NORESTART /SUPPRESSMSGBOXES', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
if Result and (ResultCode = 0) then
Log('CurStepChanged = ssInstall; uninstall OK');
//-------------
//Sleep(30000);
//-------------
end;
また、フォルダー/ファイルは次のように定義されます。
[Dirs]
Name: "{app}\db"; Flags: uninsalwaysuninstall
[Files]
Source: "..\bin\*"; DestDir: "{app}\bin"; Flags: ignoreversion createallsubdirs recursesubdirs
Source: "..\java\jre\*"; DestDir: "{app}\jre"; Flags: ignoreversion recursesubdirs createallsubdirs
blah...
テスト ケース 1; 通常のインストール: すべてがスムーズに進みます。ログファイル部分:
Starting the installation process.
Creating directory: C:\Program Files <---
Creating directory: C:\Program Files\MyApp <---
Creating directory: C:\Program Files\MyApp\db <---
Creating directory: C:\Program Files\MyApp\jre <---
Creating directory: C:\Program Files\MyApp\jre\lib
Creating directory: C:\Program Files\MyApp\jre\lib\applet
Directory for uninstall files: C:\Program Files\MyApp
Creating new uninstall log: C:\Program Files\MyApp\unins000.dat <--- !!!
-- File entry --
Dest filename: C:\Program Files\MyApp\unins000.exe <--- !!!
blah...
テスト ケース 2; 古いバージョンの更新: ステップssInstallに到達すると、アンインストーラーが起動し、終了してからインストールが開始されます。ログファイル部分:
CurStepChanged = ssInstall; uninstall OK
Starting the installation process.
Creating directory: C:\Program Files\MyApp\jre\lib
Creating directory: C:\Program Files\MyApp\jre\lib\applet
Directory for uninstall files: C:\Program Files\MyApp
Creating new uninstall log: C:\Program Files\MyApp\unins001.dat <--- !!!
-- File entry --
Dest filename: C:\Program Files\MyApp\unins001.exe <--- !!!
blah...
ご覧のとおり、一部のフォルダーが作成されず、後で「db」フォルダーに書き込もうとするとアプリが失敗します。
Sleep()コマンドのコメントを外すと、すべてがスムーズに実行され、両方のログ ファイルが同一になります。
変更をフラッシュするのに十分な時間がディスクにあるようです! どういうわけか、inno-setup に抜けている flush() コマンドがあるに違いありません。
インノグルの誰かがコメントしたり、何らかの形で助けたりできますか? sleep() の代わりに呼び出すことができる flush() はありますか? どんな助けでも大歓迎です。バグリクエストを提出する前に確認したいだけです。