Version von einer datei rausfinden



  • 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 kommen

    Ich hoffe, dass ich dir helfen konnte, allerdings habe ich mit dieser Funktion auch noch keine Erfahrungen gemacht 🙄


Anmelden zum Antworten