Einzelnen Beitrag anzeigen

Exceeder

Registriert seit: 29. Mai 2006
24 Beiträge
 
#5

Re: Versionsinformationen von EXE-Dateien synchronisieren

  Alt 6. Mai 2009, 09:04
Hallo nochmal,

ich bin mittlerweile einen entscheidenden Schritt weiter:

Delphi-Quellcode:
function WriteVersionInfo(const FileName: string; Major, Minor, Release, Build: Word): Boolean;
type
  VS_VERSIONINFO = packed record
    wLength: Word;
    wValueLength: Word;
    wType: Word;
    szKey: array[0..15] of WideChar;
    Padding1: Word;
    Value: VS_FIXEDFILEINFO;
    Padding2: Word;
    Children: Word;
  end;

var
  lHLib: Cardinal;
  lHRes: Cardinal;
  lHResLoad: Cardinal;
  lPResLock: Pointer;
  lSz: Cardinal;
  lPVersionInfo: ^VS_VERSIONINFO;
  lPt: Pointer;
  lHResUpd: Cardinal;

begin
  Result := False;

  if FileExists(FileName) then
  begin
    lHLib := LoadLibrary(PChar(FileName));

    if lHLib <> 0 then
    begin
      lPt := nil;
      lSz := 0;

      try
        lHRes := FindResource(lHLib, MakeIntResource(1), RT_VERSION);

        if lHRes <> 0 then
        begin
          lHResLoad := LoadResource(lHLib, lHRes);
          lSz := SizeofResource(lHLib, lHRes);

          if lHResLoad <> 0 then
          begin
            lPResLock := LockResource(lHResLoad);
            GetMem(lPt, lSz);
            Move(lPResLock^, lPt^, lSz);
          end;
        end;
      finally
        FreeLibrary(lHLib);
      end;

      if Assigned(lPt) then
      try
        lPVersionInfo := lPt;
        lPVersionInfo^.Value.dwFileVersionMS := (Major shl 16) or Minor;
        lPVersionInfo^.Value.dwFileVersionLS := (Release shl 16) or Build;
        lPVersionInfo^.Value.dwProductVersionMS := lPVersionInfo^.Value.dwFileVersionMS;
        lPVersionInfo^.Value.dwProductVersionLS := lPVersionInfo^.Value.dwFileVersionLS;

        lHResUpd := BeginUpdateResource(PChar(FileName), False);

        if lHResUpd <> 0 then
        begin
          try
            Result := UpdateResource(lHResUpd, RT_VERSION, MakeIntResource(1), 0, lPt, lSz);
          finally
            EndUpdateResource(lHResUpd, not Result);
          end;
        end;
      finally
        FreeMem(lPt);
      end;
    end;
  end;
end;
Das ganze funktioniert auch soweit für die FileVersion, allerdings scheint die ProductVersion damit nicht geupdated zu werden. Jemand eine Idee was da noch falsch laufen könnte?

Exceeder
  Mit Zitat antworten Zitat