Autor Beitrag
Exceeder_
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 09.01.13 16:38 
Hallo,

ich habe dieses Thema 2006 bereits einmal vorgetragen, damals konnte niemand so richtig helfen. Es geht erneut darum, in eine DLL über ein Delphi-Programm Versionsinformationen zu schreiben. Gemeint sind damit die Informationen, welche später in dem Fenster aus dem Screenshot erscheinen.

Es geht nicht darum, diese Informationen zu lesen. Ich verwende Delphi XE2. Bei einem frischen DLL Projekt ist Delphi XE2 (unter Windows 7, 64 Bit) offenbar auch nicht in der Lage diese Versionsinformationen zu schreiben. Die Versionsinformationen kann man ja im Projekt unter "Projekt" -> "Optionen..." -> "Versionsinformationen" festlegen. Erzeuge ich nach dem festlegen der Informationen das Projekt neu, dann sieht das Eigenschaftsfenster weiterhin so aus, wie im Screenshot gezeigt.

ABER: Eigentlich möchte ich diese Informationen auch nicht auf diese Art einbetten. Vielmehr möchte ich DLLs (und EXE-Dateien) nachträglich Versionieren. Das dient dazu, dass die Versionsinfos Projektweit gleich gehalten werden sollen. DDevExtensions kommen nicht in Frage, weil: 1. Delphi die Infos bei DLLs wie oben beschrieben nicht schreibt und 2. einige DLLs des Projekts nicht mit Delphi erstellt werden.

Die Google Suche erschöpft sich sehr schnell. Dort geht es meist ums lesen der Versionsinformationen. Ich möchte die Informationen aber schreiben. Falls jemand ein Kommandozeilentool für die Manipulation der Versionsinformationen kennt, wäre das auch eine Hilfe. Unter 4coder.org/delphi-source-code/914/ habe ich noch eine alte Version des XNResourceEditors ausgegraben, weil auf der offiziellen Webseite alle Links tot sind. Offenbar ist das aber nur die GUI. Zumindest kann ich mit dem Keyword "UpdateResource" nichts brauchbares finden.

Anbei noch mein aktueller Stand der Funktion, die ich zur Zeit verwende. Bei EXE-Dateien wird zumindest die Dateiversion, aber nicht die Produktversion geschrieben. Auch das verstehe ich nicht so ganz. Meine Vermutung geht irgendwie in Richtung fehlendes 32-Bit Alignment. Fehlt da eventuell noch was? Ich muss sagen, dass ich nicht ganz verstehe, was hier bei der Eigenschaft Padding1 und Padding2 gemeint ist: msdn.microsoft.com/e...01%28v=vs.85%29.aspx

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
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..15of 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 := SafeLoadLibrary(PChar(FileName), SEM_FAILCRITICALERRORS);

    if lHLib <> 0 then
    begin
      lPVersionInfo := 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);
            lPVersionInfo := lPt;
          end;
        end
        else // hier kommen wir hin, wenn gar keine Versionsinfos vorhanden sind.
          GetMem(lpVersionInfo, SizeOf(VS_VERSIONINFO));
      finally
        FreeLibrary(lHLib);
      end;

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

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

        if lHResUpd <> 0 then
        begin
          try
            Result := UpdateResource(lHResUpd, RT_VERSION, MakeIntResource(VS_VERSION_INFO), 0, lPVersionInfo, lSz);
          finally
            EndUpdateResource(lHResUpd, not Result);
          end;
        end;
      finally
        FreeMem(lPVersionInfo);
      end
      else
        raise Exception.CreateFmt('No version info found for %s', [FileName]);
    end
    else
      raise Exception.CreateFmt('Failed to load lib %s', [FileName]);
  end
  else
    raise Exception.CreateFmt('File %s does not exist', [FileName]);
end;
Einloggen, um Attachments anzusehen!
Exceeder_ Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 09.01.13 18:50 
Update: DLL Versionsinformationen werden bei Delphi Kompilaten nur geschrieben, wenn man in der DPR-Datei {$R *.res} einfügt... Zumindest stimmen dann die Sachen, die Delphi schreibt.

Trotzdem: Das Problem mit der Programmversion bleibt. Ich weiß nach wie vor nicht, wie dieses Problem zu beheben ist. Ich kann da in meinem Quelltext partout keinen Fehler entdecken. Zumal alles genauso gemacht ist, wie bei der Dateiversion.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 09.01.13 21:00 
user profile iconExceeder_ hat folgendes geschrieben Zum zitierten Posting springen:
weil auf der offiziellen Webseite alle Links tot sind.

Die aktuellste Version (3.0.0.1, Build 7061) findest Du zum Beispiel hier: www.softpedia.com/pr...-Download-78883.html

Auf der offiziellen Webseite funktionieren die drei Links für "Resource Utilities", "Low Level Utilities" und "Image Types packages" noch. Die Links findest Du direkt über dem ScreenShot des Programms.

Nachtrag: Der SourceCode des Programms ist hier zu finden: sourceforge.net/proj...esource%20Editor%29/
Knulli
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 116
Erhaltene Danke: 2

Win2k, Win7, Win10
D5, D2005, D2006, D2007, D10.4.2
BeitragVerfasst: Mi 09.01.13 22:22 
In der Windows-Hilfe "Platform-SDK" steht was von:

Zitat:
You can add version information to any files that can have Microsoft Windows resources, such as DLLs, executable files, or font files. To add the information, create a VERSIONINFO Resource and use the resource compiler to compile the resource.


Vielleicht hilft Dir das weiter, wenn Du in Richtung "Ressourcencompilers" suchst...

mfg
Exceeder_ Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 10.01.13 10:43 
Hallo,

danke für die Antworten. Die Links unten auf der offiziellen Webseite zu den nötigen Komponenten habe ich überlesen. :(

Der Autor des Programms liest und schreibt die Versionsinfos offenbar ohne UpdateResource und ändert die Eigenschaften quasi per Hand. Das heißt, hier kann ich wohl eine Lösung finden. :)