Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Versionsnummer aus EXE auslesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.12.2005, 15:56 Uhr
~fasmat
Gast


Hi Leute!

Ich hab eine kleine Frage: Ich will aus einer exe-Datei die Dateiversion auslesen... Ich hab 2 identische Programme mit Dev-C++ erstellt, die nur unterschiedliche Build-Nummern haben, nämlich 0.0.1.4 und 0.0.1.5. Hab mich mal ein bisschen mit einem Hex-Editor herumgespielt und folgendes herausgefunden:

Es gibt 12 Abweichungen (mit 10 davon kann ich nix anfangen kenn mich hald nicht so gut mit Hex-Code aus) aber 2 weichen weichen wie folgt ab: bei 0.0.1.4 ist der eine Wert 04 bei 0.0.1.5 ist er 05 und das bei beiden Abweichungen! Jetzt liegt nahe, dass eine der beiden die Versionsnummer beinhaltet... die Frage ist nur welche: Hab mal den Code-Abschnitt mit dem Unterschied hier aufgelistet:


Code:
Offset   |  0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
-----------------------------------------------------------
00001850 | 00 00 00 00 00 00 00 00  F8 02 34 00 00 00 56 00
00001860 | 53 00 5F 00 56 00 45 00  52 00 53 00 49 00 4F 00
00001870 | 4E 00 5F 00 49 00 4E 00  46 00 4F 00 00 00 00 00
00001880 | BD 04 EF FE 00 00 01 00  00 00 00 00 04 00 01 00
00001890 | 00 00 00 00 04 00 01 00  00 00 00 00 00 00 00 00


An 0000188C und an 00001894 sind die beiden Abweichungen Und der Code davor, nämlich:


Code:
Offset   |  0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
-----------------------------------------------------------
00001850 |                                            56 00
00001860 | 53 00 5F 00 56 00 45 00  52 00 53 00 49 00 4F 00
00001870 | 4E 00 5F 00 49 00 4E 00  46 00 4F


heißt in ANSI-Code ja (00 durch Lehrzeichen ersetzt): V S _ V E R S I O N _ I N F O, würde also Sinn machen. Meine Frage ist jetzt nur, warum wiederholt sich die Zeichenfolge 00 01 00 00 00 00 00 04? Buildnummer ist hier wie gesagt 0.0.1.4. Wenn man die 1 als vorlezte Buildnummer ansieht und die beiden 00 davor als Major und Minor Version, warum ist dann für die jeweils 1 byte reserviert und für die build nummer 6 bytes? Sind meine Überlegungen überhaupt richtig?

Viele Fragen... aber vieleicht kann mir ja jemand helfen

Mfg
fasmat

Dieser Post wurde am 15.12.2005 um 16:04 Uhr von fasmat editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.12.2005, 15:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


schau dir das "CFileVersion" von codeproject/guru an, da dürfte auch drin stehen wie die das auslesen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.12.2005, 16:01 Uhr
~fasmat
Gast


Danke für die schnelle Antwort Werds mir gleich anschauen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.12.2005, 16:02 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ist zwar mfc, aber das meiste sind api-aufrufe bild ich mir ein (das auslesen)
--
class God : public ChuckNorris { };

Dieser Post wurde am 15.12.2005 um 16:03 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.12.2005, 16:05 Uhr
~fasmat
Gast


Hab mal gegooglet... Die Funktionen sind ja für Visual C++ Ich verwende aber den Dev-C++. Kann man die dazuinstallieren oder gibt's etwas Vergleichbares beim Dev-C++?
Dieser Post wurde am 15.12.2005 um 16:05 Uhr von fasmat editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.12.2005, 10:46 Uhr
RHBaum



Gibt direkt WINAPI funktionen fuer ... die komische interne Versions-Nummer iss auch total win32 spezifisch ^^


Ich such mal ....

C++:
DWORD dwx = 0;
DWORD dwSize = GetFileVersionInfoSizeA(strFile,&dwx);
if(dwSize)
{
    char * buffer = new char[dwSize];
    GetFileVersionInfo(strFile,0,dwSize,buffer);
    // nun hier die info raus generieren ....
    UINT len = 0;
    LPVOID lpvi;
    BOOL bret = ::VerQueryValueA(buffer,"\\VarFileInfo\\Translation",&lpvi,&len);
    if(bret != FALSE)
    {
        //
        WORD langID =  * reinterpret_cast<WORD *>(lpvi);
        WORD charSet = * (reinterpret_cast<WORD *>(lpvi) +1 );
            
        char query[1024];
            _snprintf(query,1024,"\\StringFileInfo\\%04x%04x\\FileVersion",langID,charSet);
        // haben query String, nu file info abragen ....
        LPTSTR pVal;
        bret = VerQueryValue(buffer,query,reinterpret_cast<LPVOID*>(&pVal), &len);
        if (bret != FALSE)
        {
            // wir haben die VersionsNummer nu .....
            // nu nur noch convertieren !
            lreturn = convertfromString(pVal);
        }
        delete buffer;
    }



Funktioniert mit DLLs zumidnest ... iss nur nen Stueck code , da wo ichs mal verwende

GetFileVersionInfoSizeA
GetFileVersionInfo
VerQueryValue/VerQueryValueA
stehen in <winver.h>
brauchst aber version.lib dazu, weiss nicht, ob es fuer den gcc ne entsprechende libversion.a gibt .....

Ciao ...

Dieser Post wurde am 16.12.2005 um 10:51 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: