Dateiversion einer DLL bestimmen



  • Hallo zusammen,

    wie kann ich denn die Dateiversion einer DLL programmatisch bestimmen? V.a., wenn ich selbst diese DLL bin?

    Und zwar geht es nicht um die Dateiversion, die im Versionstab des Eigenschaftenrequesters ganz oben steht, sondern um die, die in der Spalte "Elementname:" im Versionsinformationsblock (untere 2 Drittel des Requesters)!

    Habe bisher nur ein Bsp. gefunden, bei dem man die Versionsinformation mittels GetFileVersionInfo ermittelt. Für diese Funktion habe ich allerdings bisher keine Möglichkeit gefunden, die Informationen im unteren Bereich auszulesen!

    Bei diesem Thread hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-79011-and-highlight-is-dateiversion.html geht der Link im letzten Beitrag nicht mehr!

    Kann mir da bitte jmd weiterhelfen?

    Vielen Dank schon einmal!

    Ciao



  • Version-Resource hinzufügen?



  • Wo hinzufügen? Zur DLL? Da ist sie dabei, und wird auch angezeigt, wenn man sich die Eigenschaften der DLL anschaut.

    Nur wie lese ich das programmiertechnisch aus? Vor allem, wie kann ich diese Information innerhalb der DLL selbst am besten bestimmen?

    Ciao


  • Mod

    Siehe Paul DiLascia CModuleVersion
    http://www.microsoft.com/msj/0498/c0498.aspx



  • Danke für den Link.

    Leider funktioniert das bei MS angegebene Bsp. für die Bestimmung aller Language-Codepage-Versionen nicht (s. http://msdn.microsoft.com/en-us/library/ms647464(VS.85).aspx).

    Allerdings ist hier: http://msdn.microsoft.com/en-us/library/ms646994(VS.85).aspx sie Rede von "multiple version resources".

    Gibt es denn da noch eine (einfachere) Möglichkeit an die Informationen in diesem unteren Block zu kommen?

    Es handelt sich dabei auch immer um dieselbe: Den Wert für den Eintrag "Dateiversion"?!

    Ciao



  • GetFileVersionInfo()
    GetFileVersionInfoSize()
    VerQueryValue()


  • Mod

    Was geht nicht?

    Die Dateiversion steht als doppelter DWORD Wert im statischen Block!
    Der Stringwert spielt i.A. keine Rolle.

    VS_FIXEDFILEINFO
    http://msdn.microsoft.com/en-us/library/ms646997(VS.85).aspx



  • Hm, dachte die FileVersion ist die Dateiversion aus dem Versioninformation-Block und diese ist nur via Sprache und Codepage zugreifbar!?

    Ich bekomme nun mein gewünschtes Ergebnis mit folgendem:

    const char fileVersionBlock[] = TEXT("\\StringFileInfo\\%04x%04x\\FileVersion");
    char subBlock[strlen(fileVersionBlock) + 9];
    sprintf(subBlock, fileVersionBlock, 2057, 1252);
    UINT cbTranslate;
    LPVOID lpBuffer;
    VerQueryValue(versionInfo, subBlock, &lpBuffer, &cbTranslate);
    ...
    

    Das tut für mich. Language und Codepage habe ich direkt aus dem Resourcefile.

    Geht das Ganze auch zuverlässig ohne Sprache und Codepage?

    Ciao


  • Mod

    Du brauchst keinen Sub-Block zu lesen.
    Die Versioninfos die zum Beispiel Relevant für das Setup sind stehen in VS_FIXEDFILEINFO.

    Dene Methode ist nicht zuverlässig, da sie nur eine spezifische Sprache berücksichtigt.



  • Hm. Liefert mir der Wert aus dem statischen Bereich denn das, was in folgendem Bild in der markierten FileVersion enthalten ist?

    http://www.windowsfordevices.com/files/misc/microsoft_jet.jpg (Kann leider kein eigenes Bild posten, drum hier der Verweis auf eines im Web)

    Dieser Wert ist doch ein String, oder? Die Fileversion-Werte aus der VS_IXEDFILEINFO Struktur sind aber wohl binär abgelegt (d.h. hier wüsste ich nicht, wie ich z.B. auf einen Wert von 4.00.9511.0 kommen könnte!)!

    Oder versteh ich da was falsch?

    Ciao


  • Mod

    Wie wäre es einfach mal mit lesen der MSDN?
    VS_FIXEDFILEINFO:

    dwFileVersionMS
    Specifies the most significant 32 bits of the file's binary version number. This member is used with dwFileVersionLS to form a 64-bit value used for numeric comparisons.
    dwFileVersionLS
    Specifies the least significant 32 bits of the file's binary version number. This member is used with dwFileVersionMS to form a 64-bit value used for numeric comparisons.

    Daraus folgt:

    VS_FIXEDFILEINFO fi;
    ...
    srintf(szAnyThing,"%d.%d.%d.%d",
     HIWORD(fi.dwFileVersionMS),LOWORD(fi.dwFileVersionMS),
     HIWORD(fi.dwFileVersionLS),LOWORD(fi.dwFileVersionLS));
    


  • Bin an der Stelle in C und der Windows-API leider noch zu unerfahren. Diese Variante hatte ich zuerst. Dabei kam bei mir aber der Wert 1.0.0.0 raus, dieser ist in meinem Fall der Wert des "File version"-Eintrages oben im Bild.

    Bei mir unterscheiden sich die beiden Werte, im verlinkten Bild sind sie leider gleich!

    Daher dachte ich, dass das Auslesen aus VS_FIXEDFILEINFO nur den oberen Wert liefert, nicht den unteren!

    Oder sehe ich das falsch?

    Den Wert brauche ich für die Weiterverarbeitung dann eh als String und da ich die DLL und die Resource-Datei selbst erstelle ist das Auslesen mit der festen Sprache erst einmal nicht das Problem. (Das Auslesen soll sein, keine Hartkodierung der Version in der DLL).

    Ciao


  • Mod

    Dann beschätige Dich mal mit den Versioninfos.
    XP+Vista zeigt nur das an was in FILEVERSION steht.
    VALUE "FileVersion" ist wurscht.

    Und was hast Du da stehen?



  • Ich habe da 1.0.0.0 stehen. Aber diesen Wert möchte ich nicht auslesen. Ich brauche von meiner eigenen DLL, zu der ich auch die Resource-Datei erstelle den Wert, der hinter VALUE "FileVersion", steht und möchte diesen auslesen!

    Ciao


  • Mod

    Reth schrieb:

    Ich habe da 1.0.0.0 stehen. Aber diesen Wert möchte ich nicht auslesen. Ich brauche von meiner eigenen DLL, zu der ich auch die Resource-Datei erstelle den Wert, der hinter VALUE "FileVersion", steht und möchte diesen auslesen!

    Ciao

    Und nochmal: Unter Vista ist dieser Wert irrelevant! Genauso wie diese Info für MSI irrelevant ist. Ja nicht mal in bestimmten Toolstips wird der angezeigt.
    Es zählt nur was oben unter VS_FIXEDFILEINFO steht.

    Wenn man Versionsinfos schon pflegt, dann sollte man es richtig machen...

    Wenn Du ihn dennoch willst musst Du een den korrekten Subknoten angeben.



  • Ich dachte, genau das mache ich (den korrekten Subknoten angeben)! Allerdings mit Hilfe von Sprache und Codepage. Und meine Frage ist: Geht das auch ohne Sprache und Codepage in irgend einer Form?

    Nebenbei: Diese Information ist auch nur für mich zur Laufzeit relevant!

    Ciao


Anmelden zum Antworten