5

セットアップ中にINFファイル[.inf]から値を読み取る方法を知る必要があります。インストーラーに、更新するプログラムのバージョンを確認してもらいたい。このプログラムのバージョンは、レジストリやその他のファイルには保存されず、.infファイルにのみ保存されます。次に、そこからバージョンを取得する必要があります。

私はあなたの答えを得ました、@Tlamaと私はソフトウェアのバージョンを取得するためにDLLを使用することはできません。このプログラムは、現在のバージョンのみをINFファイルに保存します。

私がやりたいのは、インストーラーに、使用しているソフトウェアの現在のバージョンを確認させ、そのバージョンをラベルテキストで表示させることです。

inf情報は次のとおりです。

NetVersion=1.1.1.1
PatchVersion=2.0.1
ProductName=SoftwareX

バージョンが表示された後に表示するPatchVersionが必要です:####:

ここに画像の説明を入力してください

これは私が修正しようとしているコードです:

function GetInfsam: String;
var
  sVersion : String;
Begin
  sVersion := '';
  GetIniString('', 'PatchVersion', 'sVersion', '{app}\Sam.inf');
  Result := sVersion;
end;

Procedure InitializeWizard7();
var
  L2Ver1 : Tlabel;
  L2Ver2 : Tlabel;
Begin
  L2Ver1:=  TLabel.Create(WizardForm);
  L2Ver1.Transparent:= True;
  L2Ver1.AutoSize:= False;
  L2Ver1.WordWrap:= True;
  L2Ver1.Font.name:= 'Agency FB';
  L2Ver1.Font.Size:= 12;
  L2Ver1.Font.Color:= clwhite;
  L2Ver1.Caption:= 'Version:';
  L2Ver1.Parent:= WizardForm.SelectdirPage;
  L2Ver1.Left := 5;
  L2Ver1.top := 260;
  L2Ver1.Width := 150;
  L2Ver1.Height := 40;

  L2Ver2:=  TLabel.Create(WizardForm);
  L2Ver2.Transparent:= True;
  L2Ver2.AutoSize:= False;
  L2Ver2.WordWrap:= True;
  L2Ver2.Font.name:= 'Agency FB';
  L2Ver2.Font.Size:= 12;
  L2Ver2.Font.Color:= clwhite;
  L2Ver2.Caption:= GetInfsam;
  L2Ver2.Parent:= WizardForm.SelectdirPage;
  L2Ver2.Left := L2Ver1.Width + L2Ver1.Left + 8;
  L2Ver2.top := 260;
  L2Ver2.Width := 100;
  L2Ver2.Height := 40;
End;

コードを修正するために助けが必要です。

4

2 に答える 2

10

INF ファイルの読み方

INF ファイルは、拡張子が .ini の INI ファイルのようなものですspecified syntax。したがって、INF ファイルを操作するには、それらを通常の INI ファイルとして扱う必要があります。次のような INF ファイルがあるとします。

[Add.Code]
File.dll=File.dll

[File.dll]
File=http://www.code.com/file.dll
FileVersion=1,0,0,143

この方法FileVersionを使用してキーを読み取ることができます。GetIniString

procedure InitializeWizard;
var
  Version: string;
begin
  Version := GetIniString('File.dll', 'FileVersion', '', 'c:\File.inf');
  if Version <> '' then
    MsgBox('File version: ' + Version, mbInformation, MB_OK);
end;

アップデート:

1. 不正な形式の INF ファイル

更新によると、INF ファイルの内容が次のようになっている場合:

NetVersion=1.1.1.1
PatchVersion=2.0.1
ProductName=SoftwareX

その場合、これは整形式の INF ファイルではなく、INF 拡張子で保存された名前と値のペアのテキスト ファイルです。[]実際の INF ファイルには、キー値セットごとに有効なセクションが必要ですが、このセクションがファイルにありません。

2. GetIniString 関数は、空の Section パラメーター値で呼び出すことはできません

内部的に呼び出される関数の場合、指定されたキーの値ではなく、指定されたファイルのすべてのセクション名を返すことを意味するため、GetIniString空のパラメーター値で関数を呼び出してはなりません。たとえば、最初のパラメーターを空にすることはできないため、次の呼び出しは無効です。SectionGetPrivateProfileStringSection

GetIniString('', 'KeyName', 'Default', 'c:\File.xxx');

3. 名前と値のペアのテキスト ファイルを使用する方法は?

テキスト ファイルと同じように、そのファイルを操作する必要があります。TStringListキー値のテキスト ファイルの処理については、このクラスを使用するか、少なくとも Delphi で使用するのが理想的です。InnoSetup では残念ながら、TStringListキー値のコンテンツ操作に必要な公開プロパティがクラスにないため、独自のキー値テキスト ファイル解析関数を作成する必要があります。これは、特定のキーの値を取得するためのものです。キー値の区切り文字は記号であると想定されているため=です。この関数は、指定されたファイルAKeyName内のキーの検索に成功した場合はキー値を返し、失敗した場合はデフォルト値を返します。AFileNameADefault

function GetKeyValue(const AKeyName, AFileName, ADefault: string): string;
var  
  I: Integer;
  KeyPos: Integer;
  KeyFull: string;
  FileLines: TArrayOfString;
begin
  Result := ADefault;
  if LoadStringsFromFile(AFileName, FileLines) then
  begin
    KeyFull := AKeyName + '=';
    for I := 0 to GetArrayLength(FileLines) - 1 do
    begin
      FileLines[I] := TrimLeft(FileLines[I]);
      KeyPos := Pos(KeyFull, FileLines[I]);
      if KeyPos > 0 then
      begin
        Result := Copy(FileLines[I], KeyPos + Length(AKeyName) + 1, MaxInt);
        Break;
      end;
    end;
  end;
end;

PatchVersion現在選択されているインストール パスで期待されるファイルからキーの値を読み取るには、Sam.inf次のようなものを使用できます。このスクリプトは、ユーザーがディレクトリ編集ボックスのテキストを変更するたびに、およびディレクトリ選択ページが表示されるときに、ラベルの値を更新します。

var
  // target version label must be declared globally
  L2Ver2: TLabel;

procedure DirEditChange(Sender: TObject);
var
  FilePath: string;
begin
  // assign the expected INF file path
  FilePath := AddBackslash(WizardForm.DirEdit.Text) + 'Sam.inf';
  // read the PatchVersion key value, return N/A if not found
  L2Ver2.Caption := GetKeyValue('PatchVersion', FilePath, 'N/A');
end;

procedure InitializeWizard;
begin
  // create the target label as before
  L2Ver2 := TLabel.Create(WizardForm);
  ...
  // bind the DirEditChange method to the directory edit's OnChange event
  WizardForm.DirEdit.OnChange := @DirEditChange;  
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  // if the page has been turned to the select directory page, update the
  // label caption by firing the assigned OnChange event method manually
  if (CurPageID = wpSelectDir) then
    DirEditChange(nil);
end;
于 2013-03-05T14:24:24.533 に答える
3

私のすべての INF ファイルは、INI ファイルに似た構造を持っています。それもあなたのケースである場合は、INI であるかのように INF を開くことをお勧めします (TLama の提案による)。

セットアップ関数:

function GetIniInt(const Section, Key: String; const Default, Min, Max: Longint; const Filename: String): Longint;
function GetIniString(const Section, Key, Default, Filename: String): String;

プリプロセッサで:

str ReadIni(str 1, str 2, str 3, str? 4)

説明 (Inno Setup ヘルプから)

INI ファイルから値を読み取ります。引数 1 は INI ファイルの名前、引数 2 は INI ファイル内のセクションの名前、3 番目の引数は読み取るセクションのキーです。最後のオプションの引数は、失敗時に返されるデフォルト値を提供するために使用できます。省略した場合、空の文字列が返されます。

于 2013-03-05T14:24:59.167 に答える