Dateiversion einer DLL bestimmen
-
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
-
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
-
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
-
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
-
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