Version von einer datei rausfinden
-
Hi!
Kann man irgednwie die Version von einer Datei rausfinden? Hab da schon mit GetFileInfoSize und so weiter rumgemacht, nur krieg ichs net ganz gebacken. Könnt viellecht einer mal ein codeschnipsel posten?
Thx!
-
GetFileVersionInfo
-
ja das weis ich auch. und danach Query.... aufrufen (hab den namen jetzt vergessen). Aber ich krieg das net hin. Kann viellecht jemand ein Code posten nur mal so als Beispiel?
-
Hier sollte eigentlich alles nötige stehen
-
Ja, das wieß ich ja. Ich weis welche Funktionen man braucht usw.
Aber bei mir scheiterts an der letzten (VerQeuryValue)! Ich weis dann net so ganz was ich mit dem pointer lplpBuffer anfangen soll bzw. wie ich von dem den String bekomm. Kann da net viellecht mal jemand nen kleinen Quellcode posten mit der Funktion VerQueryValue und wie er dann anschließend die Datei Version mit printf oder so ausgibt. Wär echt net wenn sich mal dafür einer Ziet nehemn könnt!!!
-
Hier ist doch sogar ein Beispiel (ganz unten)
-
Das Beispiel bringt mir nix! Ich will doch nur wissen ,was ich dannmit dem komischen Pointer anfangen soll( dem lplpBuffer)... Ich würd dann gern den String auf den der zeigt in nem Buffer abspeichern.
Kann denn nicht mal einer nen kleinen Quellcode posten (jetzt schon zum 4. Mal)!!!
-
Ähm - du hast doch bereits einen Buffer, der den String enthält und auf diesen zeigt den Pointer. Oder willst du einen C++ String
-
ja, aber ich raff das auch net ganz der Pointer is ja vom Typ LPVOID... Und das find ich ja schon komisch... weil void sin ja 0 bytes.
Ich weis in der MSDN steht UINT, aber die wandeln des später auch noch mal um in LPVOID außerdeem gibts sonst ein Compilerfehla...
jo, ich weis net so ganz was ich dann mim Pointer anfangen soll, bzw. wie ich dann den String bekommen soll(hab mit Zeigern noch net so viel am hut gehabt).
Ich finds vor allem komich das der Pointer LPVOID is... Wie gesagt, wie verwened ich dann den Pointer....
-
Das wird imho nach VOID gecastet, da je nach Angabe für SubBlock eine andere Struktur zurückgeliefert wird. Ich habe es zwar nicht getestet (und auch schon Ewigkeiten kein C/C++ mehr programmiert), aber ich probier's mal:
VS_FIXEDFILEINFO FileInfo = {0}; UINT cbFileInfo = 0; VerQueryValue(pBlock,TEXT("\\"),(LPVOID*)&fileInfo,&cbFileInfo);
Bitte nicht schlagen, falls das völliger Mist ist
Jetzt hast du mit FileInfo eine hoffentlich korrekt gefüllte VS_FIXEDFILEINFO-Struktur
Wie ich das gerade sehe, war das mit String Blödsinn, da du ja gar keinen bekommst
-
Ich krieg das immer noch net gebacken... Ich post mal meinen Quellcode, vielleicht hat dann einer ne Idee, was falsch is...
// includes void main(void){ struct _VS_FIXEDFILEINFO { DWORD dwSignature; DWORD dwStrucVersion; DWORD dwFileVersionMS; DWORD dwFileVersionLS; DWORD dwProductVersionMS; DWORD dwProductVersionLS; DWORD dwFileFlagsMask; DWORD dwFileFlags; DWORD dwFileOS; DWORD dwFileType; DWORD dwFileSubtype; DWORD dwFileDateMS; DWORD dwFileDateLS; }; struct VS_VERSIONINFO { WORD wLength; WORD wValueLength; WORD wType; WCHAR szKey[1000]; WORD Padding1[1000]; VS_FIXEDFILEINFO Value; WORD Padding2[1000]; WORD Children[1000]; } fileinfo; fileinfo.wValueLength=sizeof(VS_FIXEDFILEINFO); fileinfo.wLength=sizeof(VS_VERSIONINFO); DWORD size; unsigned int structsize=0; size=GetFileVersionInfoSize("C:\\file.dll",NULL); GetFileVersionInfo("C:\\file.dll",NULL,size,(LPVOID *) &fileinfo); VerQueryValue("C:\\file.dll",TEXT("\\"),(LPVOID *) &fileinfo,&structsize); printf("%d",fileinfo.Value.dwFileVersionLS); // hier krieg ich nur müll raus }
Hat jemand ne Idee?
-
Bei VerQueryValue solltest du doch einen Pointer auf eine VS_FIXEDFILEINFO - Struktur angeben! Oder evtl. das VerQueryValue ganz weglassen
Musst halt ein wenig rumprobieren
-
so sollte es funktionieren:
HANDLE hHeap; LPVOID lpBuffer; DWORD dwSize; UINT nLen; VS_FIXEDFILEINFO* Vffi; dwSize = GetFileVersionInfoSize("user32.dll",NULL); hHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS,0,0); lpBuffer = HeapAlloc(hHeap,HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,dwSize); if (GetFileVersionInfo("user32.dll",0,dwSize,lpBuffer)) { VerQueryValue(lpBuffer,"\\",(LPVOID*)&Vffi,&nLen); wsprintf((LPTSTR)lpBuffer,"%#x %#x",Vffi->dwProductVersionMS, Vffi->dwProductVersionLS); //... } HeapFree(hHeap,0,lpBuffer);
-
@shlo Thx für deinen Quellcode! Aber bei mir klappt des so auch net. Ich krieg da auch wieder nur müll raus. Wenn ich den Pointer auslese kommt irgendwas komisches raus und auch wenn ich
Vffi->dwProductVersionMS, Vffi->dwProductVersionLS
per printf anzeigen lass, bekomm ich nur zwei komische zahlen à la -1760463 oder ähnlich...Plz help!
-
dwProductVersionMS
Specifies the most significant 32 bits of the binary version number of the product with which this file was distributed. This member is used with dwProductVersionLS to form a 64-bit value used for numeric comparisons.
dwProductVersionLS
Specifies the least significant 32 bits of the binary version number of the product with which this file was distributed. This member is used with dwProductVersionMS to form a 64-bit value used for numeric comparisons.Was für Werte stellst du dir da denn vor? Wie sollten die deiner Meinung nach aussehen
Und was willst du damit überhaupt anstellen?
-
Ich will auf die Weise die Treiberversion vom Detonator rausfinden. Also z.B 44.03 (oder 4.4.0.3)! Das geht auch, weil die dlls von dem haben auch ressourcen in denen die Version drinne is.
Außerdem denk ich nicht das so Zahlen wie -189235 stimmen können, oder?
-
Kann mir denn wirklich niemand helfen!
-
1.) Ein DWORD ist ein 32-bit unsigned integer -> wenn du einen negativen Wert bekommst hast du irgendwo falsche Typen verwendet
2.) Wird dir wohl eher nicht weiterhelfen, aber so wie es für mich aussieht sind die beiden Werte dazu gedacht, sie zu einem ULARGE_INTEGER zusammenzufassen
3.) Ist auch nur rumgeraten, aber evtl kannst du mit HIWORD und LOWORD die jeweiligen Ziffern auslesen
4.) Evtl. musst du statt dwProductVersionMS und dwProductVersionLS auch dwFileVersionMS und dwFileVersionLS verwenden, um auf diese Nummer zu kommenIch hoffe, dass ich dir helfen konnte, allerdings habe ich mit dieser Funktion auch noch keine Erfahrungen gemacht