AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Versionsinfo aus Ressource (Stream?) lesen

Ein Thema von idefix2 · begonnen am 29. Mai 2015 · letzter Beitrag vom 1. Jun 2015
 
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#4

AW: Versionsinfo aus Ressource (Stream?) lesen

  Alt 30. Mai 2015, 15:08
Wie himitsu sagte, musst du die Datei erst mal speichern, bevor du die Windows API "GetFileVersionInfo" benutzt.
Oder du liest die Daten direkt selbst aus, ist nicht schwierig. Ich habe das auch mal gebraucht, hier meine Lösung:

Delphi-Quellcode:
function VSFixedFileInfoToString(const VS: TVSFixedFileInfo; const AsInt64: PInt64): string;
begin
  with VS do
  begin
    Result := Format('%d.%d.%d.%d', [HiWord(dwFileVersionMS), // Major
      LoWord(dwFileVersionMS), // Minor
      HiWord(dwFileVersionLS), // Release
      LoWord(dwFileVersionLS)]); // Build
    if Assigned(AsInt64) then
      AsInt64^ := Int64(dwFileVersionMS) shl 32 or dwFileVersionLS;
  end;
end;

function GetFileVersionFromResource(const ResourceName: string; AsInt64: PInt64 = nil): string;
var
  RS: TResourceStream;
begin
  RS := TResourceStream.Create(HInstance, ResourceName, RT_RCDATA);
  try
    Result := GetFileVersionFromStream(RS, AsInt64);
  finally
    RS.Free;
  end;
end;

function GetFileVersionFromStream(Stream: TStream; AsInt64: PInt64 = nil): string;
const
  Offset = 2048;
  VS_VERSION_INFO: WideString = 'VS_VERSION_INFO';
  Signature = $FEEF04BD;
var
  WS: WideString;
  PVerValue: PVSFixedFileInfo;
  i: Integer;
begin
  Result := '';
  if Assigned(AsInt64) then AsInt64^ := 0;
  // Die Versionsinfo-Daten befinden sich ziemlich am Ende einer EXE/DLL
  // gehe also zum Ende des Streams minus Offset (2 KB sollten genügen)
  Stream.Seek(-Offset, soFromEnd);
  // Daten in WideString kopieren
  i := Stream.Size - Stream.Position;
  SetLength(WS, i div 2 + 1);
  Stream.ReadBuffer(WS[Low(WS)], i);
  // Position der ID 'VS_VERSION_INFO' ermitteln, Signatur prüfen, Version auslesen
  i := Pos(VS_VERSION_INFO, WS);
  PVerValue := PVSFixedFileInfo(@WS[i + Length(VS_VERSION_INFO) + 2]);
  if (i >= Low(WS)) and (PVerValue^.dwSignature = Signature) then
    Result := VSFixedFileInfoToString(PVerValue^, AsInt64);
end;
Liefert die Version als String zurück ("w.x.y.z") und optional als Int64.

Geändert von SMO (30. Mai 2015 um 15:20 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz