Versionsnummer ermitteln



  • Hallo

    Ich bin noch mehr oder weniger Anfänger und versuche die Versionsnummer einer beliebigen Anwendung ermitteln. Im Forum habe ich zwar einige Beiträge dazu gefunden, jedoch bringe es nicht fertig die Nummer zu ermitteln.

    Nach dem erfolgreichen anwenden der Methoden "GetFileVersionInfoSize" und "GetFileVersionInfo" kapiere ich nicht, wie ich mit "VerQueryValue" die Versionsnummer ermitteln kann

    UINT uLen;
        DWORD nSize;
        char *pInfo;
        wchar_t *pVersion;
        AnsiString strText = "Version = ";
        AnsiString strFileName = Edit1-Text;
    
        nSize = GetFileVersionInfoSize(strFileName.c_str(), 0 );
        if ( nSize )
        {
          pInfo = new char[nSize];
          GetFileVersionInfo( strFileName.c_str(), 0, nSize, pInfo );
          VerQueryValue( pInfo,
            TEXT( "\\StringFileInfo\\040704B0\\ProductVersion" ),
            (void**)&pVersion, (PUINT)&uLen );
            strText += pVersion;
            Memo1->Lines->Add(strText);
        }
    

    Wenn ich das richtig verstanden habe, sollte die Versionsnummer in die Variable "pVersion" geschrieben werden, der Rückgabewert lautet bei mir jedoch "\xAB48Z\b"

    Ich wäre froh wenn mir jemand sagen könnte was ich falsch mache, bzw. was ich anders machen muss. Danke

    Benutze übrigens den Borland C++ Builder 6



  • naja, dazu müsstest du natürlich schon die richtigen info auslesen!

    // Funktion liefert einen AnsiString der Versionsnummer der übergebenen Datei
    AnsiString GetFileVersionString(const AnsiString &FileName)
    {
      // prüfen ob überhaupt Info da sind
      DWORD      nSize  = GetFileVersionInfoSize(FileName.c_str(), 0);
      AnsiString Result = "";
    
      if (nSize)
      {
        char *pInfo = new char[nSize];
    
        // Versionsinfo auslesen
        GetFileVersionInfo(FileName.c_str(), 0, nSize, pInfo);
    
        VS_FIXEDFILEINFO *FileInfo;
        UINT              uLen;
    
        // Root-Information auslesen
        VerQueryValue(pInfo, "\\", (void**) &FileInfo, (PUINT) &uLen);
    
        // Speicher freigeben
        delete [] pInfo;
    
        // Versionsnummer bilden
        Result.sprintf("%d.%d.%d.%d",
                       HIWORD(FileInfo->dwProductVersionMS),
                       LOWORD(FileInfo->dwProductVersionMS),
                       HIWORD(FileInfo->dwProductVersionLS),
                       LOWORD(FileInfo->dwProductVersionLS));
      }
    
      return Result;
    }
    
    // Version der Anwendung ermitteln
    AnsiString FileVersion = "Version: " + GetFileVersionString(Application->ExeName);
    


  • Vielen Dank 👍


Anmelden zum Antworten