Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Versionskommentar setzen per Code? (https://www.delphipraxis.net/138656-versionskommentar-setzen-per-code.html)

fajac 14. Aug 2009 10:01


Versionskommentar setzen per Code?
 
Liebe Gemeinde,

in den Projektoptionen / Version Info kann man in der untenstehenden Tabelle Konstanten setzen wie "CompanyName", "FileDescription" u.s.f.
Dies kann man dann in der kompilierten Datei per Explorer im Kontextmenu sehen. Jetzt die Frage: Gibt es eine Möglichkeit, diese Werte im Code, etwa über einen Compilerschalter, zu setzen? Fiktives Beispiel:

Delphi-Quellcode:
const ExternalLibVersion = '5.5.6.35';
{$IF ExternalLibVersion = '5.5.6.35'}
  // Dies geht so natürlich nicht:
  {$VERSIONINFO[Comment]='Verwendet Bibliothek 5.5.6.35 oder hoeher' }
{$IFEND}
Hintergrund: Ich habe ein Projekt, das ich für unterschiedliche Versionen einer verwendeten Bibliothek pflegen muss. Um Versionskonflikte in den produktiven Systemen zu vermeiden, ist es gewünscht, dass man die verwendete Bibliotheksversion am Kompilat erkennen kann. Bisher setze ich den Kommentar immer vor dem Erstellen per Hand, aber das ist mühsam und wird auch gern mal vergessen, daher fehlerträchtig.

Hat jemand eine Idee dazu?
Vielen Dank im Voraus!

jfheins 14. Aug 2009 10:22

Re: Versionskommentar setzen per Code?
 
Du kannst diese Infos, die du in den Projektoptionen setzt, zur Laufzeit aus den Resourcen auslesen ;)

Evtl. könntest du dir auch ein Pre-Build-Script schreiben, was den Job erledigt, aber davon hab' ich noch weniger Ahnung :stupid:

himitsu 14. Aug 2009 12:33

Re: Versionskommentar setzen per Code?
 
von der Resource ( {projectname}.res im Projektverzeichnis) aus, bekommst du keine Konstante und auch keinen Kompilerschalter in das Programm rein.

und via Kompilerschalter kannst du diese auch nicht setzen, da dieses ja in der .RES angebeben wird in nicht im Quelltext.


Es bestünde nur die Möglichkeit sich seine ResourceDatei (.RES) selber anzulegen und deren Inhalt via Pre-Compile-Script aus einem Resource-Script (.RC) zu erstellen ... falls Delphi es nicht via {$R project.res project.rc) selber erstellen kann.

Es gibt auch ResourceEditoren, welche die .RES direkt bearbeiten können.

Möglich wäre auch etwas über die OpenToolsAPI von Delphi.

Stevie 14. Aug 2009 12:40

Re: Versionskommentar setzen per Code?
 
Versionsinformationen werden in der .res Datei des Projektes gespeichert.
Du kannst diese mit dem Resource-compiler (brc32.exe) aus einer Resource Script File (.rc) selber erstellen und dann dein Projekt kompilieren.
Für den umgekehrten Weg kannst du z.B. den Resource Hacker benutzen, um dir eine .res Datei im Klartext anzuschauen und als Resource Script File zu speichern.

P.S. Ich hasse den roten Kasten :P

himitsu 14. Aug 2009 13:07

Re: Versionskommentar setzen per Code?
 
:tongue:

Nja, im Prinzip ist es ja egal in welcher .RES diese Informationen drinstehn.
Man kann sie also auch in eine andere/eigene Resourcedatei (.res) verlegen, aber dann müssen die Versionsinfos in den Projektoptionen unbedingt abgeschaltet sein und lassen sich auch nicht mehr über diese anzeigen oder ändern. (sonst meckert der Linker wegen der doppelten Resourcen)


dieses ist z.B. ein Auszug der .RC von meinem Hier im Forum suchenFileSplitter:
das sind so die Basisinformationen, welches man in seine .RC/.RES direkt einbauen kann, also Programmicon, XP-Manifest und natürlich die Versionsinformationen
Code:
#define RT_MANIFEST 24

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

1 ICON
  BEGIN
    65536L, 538968065L, 16L, 48758784L, 1441792L, 2621440L, 2097152L, 4194304L, ...
    ..., 16711439L, 16711455L, 16711487L, 16711551L, 4294967295L, 4294967295L, 65535
  END

VS_VERSION_INFO VERSIONINFO
  FILEVERSION   2,1,0,18
  PRODUCTVERSION 1,0,0,0
  FILEFLAGSMASK 0x3fL
  FILEFLAGS     VS_FF_PRERELEASE // VS_FF_DEBUG VS_FF_PATCHED VS_FF_PRIVATEBUILD VS_FF_SPECIALBUILD
  FILEOS        VOS_NT | VOS__WINDOWS32
  FILETYPE      VFT_APP
  FILESUBTYPE   0L
  BEGIN
    BLOCK "StringFileInfo"
    BEGIN
      BLOCK "040904e4" // LANG_ENGLISH, SUBLANG_ENGLISH_US, charset:Multilingual
      BEGIN
        VALUE "CompanyName",    "FNS Enterprize's\0"
        VALUE "FileVersion",    "v2.1 (18) beta\0"
        VALUE "LegalCopyright", "© 1997–2008 by FNS*Enterprize's™ (himitsu)\0"
        VALUE "LegalTrademarks", "FNS Enterprize's™",
                                 "Delphi–PRAXiS\0"
        VALUE "Comments",       "FreeWare\0"
        VALUE "Copyright",      "© 1997–2008 by\r\nFNS*Enterprize's™",
                                 "©*2003–2008*by\r\nhimitsu*@*Delphi–PRAXiS\0"
        VALUE "Languages",      "english\0"
      END
    END
    BLOCK "VarFileInfo"
    BEGIN
      VALUE "Translation", LANG_ENGLISH | (SUBLANG_ENGLISH_US << 10), 1252L // carset:Multilingual
    END
  END

1 RT_MANIFEST
  BEGIN
    "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\r\n",
    "\r\n",
    "<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">\r\n",
    " <assemblyIdentity\r\n",
    "   type                 = \"win32\"\r\n",
    "   name                 = \"Borland.Delphi.XP-Application\"\r\n",
    "   version              = \"1.1.0.0\"\r\n",
    "   processorArchitecture = \"x86\"\r\n",
    " />\r\n",
    " <description></description>\r\n",
    " <dependency optional=\"yes\">\r\n",
    "   <dependentAssembly>\r\n",
    "     <assemblyIdentity\r\n",
    "       type                 = \"win32\"\r\n",
    "       name                 = \"Microsoft.Windows.Common-Controls\"\r\n",
    "       version              = \"6.0.0.0\"\r\n",
    "       language             = \"*\"\r\n",
    "       processorArchitecture = \"x86\"\r\n",
    "       publicKeyToken       = \"6595b64144ccf1df\"\r\n",
    "     />\r\n",
    "   </dependentAssembly>\r\n",
    " </dependency>\r\n",
    "</assembly>\r\n"
  END

fajac 14. Aug 2009 14:33

Re: Versionskommentar setzen per Code?
 
Erst einmal vielen Dank für das Feedback!

Ich habe in der Zwischenzeit ein bischen herumgespielt, u.a. mit den ToolsAPI, und folgendes herausgefunden:
1) Die Optionen werden außer in der Ressourcedate auch in der .dof-Datei des Projekts gespeichert. Löscht man die Ressource und öffnet das Projekt erneut, dann wird sie mit den Informationen in der .dof-Datei neu erzeugt.
2) Ich kann per ToolsAPI die Versions-Optionen vor dem Kompilieren setzen. Wenn ich in der entsprechenden Methode danach das Projekt speichere, ist der modifizierte Wert in der .dof-Datei gespeichert, nicht jedoch in der Ressource.
3) Selbst wenn ich in der Methode vorher die Ressourcedatei lösche (klappt), wird sie nach dem Speichern mit den alten Werten erzeugt und das Kompilat enthält logischerweise die alten Werte.

Daraus folgt: Die Ressourcendatei wird beim Laden des Projekts mitgeladen. Ist sie nicht vorhanden, wird sie erst erzeugt. Beim programmatischen Ändern der Optionen wird die geladene Ressource nicht modifiziert (Ich sehe das als einen Bug der ToolsAPI an, ärgerlich!).

Frage : Kennt jemand eine Methode, mit der man die geladene Ressource aus dem (IDE)Speicher entfernen kann? Das könnte beim Kompilieren zu euner Neuerzeugung führen, und dann hätte ich gewonnen.
Oder kennt sich jemand mit der Verwendung von IOTAProjectResource aus, so dass ich die Ressource im Speicher ändern kann?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:07 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