versionsnummer ermitteln



  • Vodn7V schrieb:

    (C++ Objektorientiertes Programmieren von Anfang an)

    Ist das das von Helmut Erlenkötter? Habe mit dem und seinem C - Buch auch angefangen. Habe bisher auch nur Gutes darüber gehört und mir persönlich hat es auch gut gefallen. 😉



  • habe alles etwas abgespeckt und das array angelegt. aber der fehler ist trotzdem noch da .

    #include<iostream>
    #include<afx.h>
    #include<cstring>
    
    using namespace std;
    
    CString GetFileVersionString(const CString FileName)
    {
    CString Result = "";
    
    GetFileVersionInfo(FileName,0,0,0);
    
    VS_FIXEDFILEINFO *FileInfo;
    UINT uLen;
    
    VerQueryValue(0, "\\", (void**) &FileInfo, (PUINT) &uLen);
    
    Result.Format("%d.%d.%d.%d",
    HIWORD(FileInfo->dwProductVersionMS),
    LOWORD(FileInfo->dwProductVersionMS),
    HIWORD(FileInfo->dwProductVersionLS),
    LOWORD(FileInfo->dwProductVersionLS));
    
    return Result;
    }
    
    int main (void)
    {
    char namefile[100];
    
    string name(":\\Dokumente und Einstellungen\\Hereich\\Desktop.test.exe");
    
    strcpy(namefile,name.c_str());
    
    CString FileVersion = "Version: " + GetFileVersionString(namefile);
    
    return 0;
    }
    

    hierbei kommt der gleich konvertierungsfehler wie vorher auch.
    ########################################################################
    habe es etwas anders gemacht. jetzt bekomme ich keine direkte fehlermeldung mehr. beim ausführen jedoch sagt er mir :

    LINK : fatal error LNK1104: Datei "nafxcwd.lib" kann nicht geoeffnet werden
    Fehler beim Ausführen von link.exe.

    gffgh.exe - 1 Fehler, 0 Warnung(en)

    #include<iostream>
    #include<afx.h>
    #include<string>
    
    using namespace std;
    
    CString GetFileVersionString(char *FileName)
       {
         // prüfen ob überhaupt Info da sind
         DWORD   nSize  = GetFileVersionInfoSize(FileName, 0);
         CString Result = "";
    
         if (nSize)
               {
                  char *pInfo = new char[nSize];
    
                  // Versionsinfo auslesen
                  GetFileVersionInfo(FileName, 0, nSize, pInfo);
    
                  VS_FIXEDFILEINFO *FileInfo;
                  UINT              uLen;
    
                   // Root-Information auslesen
                  VerQueryValue(pInfo, "\\", (void**) &FileInfo, (PUINT) &uLen);
    
                  // Versionsnummer bilden
                  Result.Format("%d.%d.%d.%d",
                       HIWORD(FileInfo->dwProductVersionMS),
                       LOWORD(FileInfo->dwProductVersionMS),
                       HIWORD(FileInfo->dwProductVersionLS),
                       LOWORD(FileInfo->dwProductVersionLS));
    
                 // Speicher freigeben (ich bin mir nicht sicher, aber vermutlich zeigt FileInfo auf diesen Datenbereich)
                 delete [] pInfo;
              }
    
         return Result;
       }
    
    int main (void)
    {
     char namefile;
    
    string name(":\\Dokumente und Einstellungen\\Hereich\\Desktop.test.exe");
    
    strcpy(&namefile,name.c_str());
    
    CString FileVersion = "Version: " + GetFileVersionString(&namefile);
    
    return 0;
    
    }
    


  • Wenn du die Daten in ein Array umpacken willst, dann bitte lokal in der Funktion (aktuell werden die Daten beim Funktionsaufruf wieder zurückgeschrieben in einen CString - und damit stehst du an der selben Stelle wie vorher):

    CString GetFileVersionInfoString(const CString& fname)
    {
      char* fname_l=new char[fname.Length()+1];
      strcpy(fname_l,fname);
    
      DWORD nSize=GetFileVersionInfoSize(fname_l,0);
      ...
    }
    


  • sorry komme mir schon nervig vor. aber es klappt immer noch nicht. er erkennt das

    char* fname_1 = new char [FileName.Length +1];

    davon das "Length" nicht : Ist kein Element von 'CString'.

    ansonsten siehts jetzt so aus:

    #include<iostream>
    #include<afx.h>
    #include<string>
    
    using namespace std;
    
    CString GetFileVersionString(const CString &FileName)
       {
    
          char*  fname_1 = new char [FileName.Length +1];
          strcpy(fname_1,FileName);
    
         // prüfen ob überhaupt Info da sind
         DWORD   nSize  = GetFileVersionInfoSize(fname_1, 0);
         CString Result = "";
    
         if (nSize)
               {
                  char *pInfo = new char[nSize];
    
                  // Versionsinfo auslesen
                  GetFileVersionInfo(fname_1, 0, nSize, pInfo);
    
                  VS_FIXEDFILEINFO *FileInfo;
                  UINT              uLen;
    
                   // Root-Information auslesen
                  VerQueryValue(pInfo, "\\", (void**) &FileInfo, (PUINT) &uLen);
    
                  // Versionsnummer bilden
                  Result.Format("%d.%d.%d.%d",
                       HIWORD(FileInfo->dwProductVersionMS),
                       LOWORD(FileInfo->dwProductVersionMS),
                       HIWORD(FileInfo->dwProductVersionLS),
                       LOWORD(FileInfo->dwProductVersionLS));
    
                 // Speicher freigeben (ich bin mir nicht sicher, aber vermutlich zeigt FileInfo auf diesen Datenbereich)
                 delete [] pInfo;
              }
    
         return Result;
       }
    
    int main (void)
    {
    
    CString FileVersion = "Version: " + GetFileVersionString(":\\Dokumente und Einstellungen\\Hereich\\Desktop.test.exe");
    
    return 0;
    
    }
    


  • Die Methode heißt GetLength - wie dir ein Blick in die MSDN Library gezeigt hätte. Die runden Klammern darfst du übrigens nicht weglassen.



  • ja habe ich gesehen. auch ausprobiert aber es hat genauso wenig funktioniert. er sagt zwar beim testen 0 Fehler aber wenn ich es Ausführen will kommt immer:nker-Vorgang läuft...
    LINK : fatal error LNK1104: Datei "nafxcwd.lib" kann nicht geoeffnet werden
    Fehler beim Ausführen von link.exe.

    testerei.exe - 1 Fehler, 0 Warnung(en)

    #include<iostream>
    #include<afx.h>
    #include<string>
    
    using namespace std;
    
    CString GetFileVersionString(const CString &FileName)
       {
    
       char*  fname_1 = new char [FileName.GetLength() +1];
    
       strcpy(fname_1,FileName);
    
         // prüfen ob überhaupt Info da sind
         DWORD   nSize  = GetFileVersionInfoSize(fname_1, 0);
         CString Result = "";
    
         if (nSize)
               {
                  char *pInfo = new char[nSize];
    
                  // Versionsinfo auslesen
                  GetFileVersionInfo(fname_1, 0, nSize, pInfo);
    
                  VS_FIXEDFILEINFO *FileInfo;
                  UINT              uLen;
    
                   // Root-Information auslesen
                  VerQueryValue(pInfo, "\\", (void**) &FileInfo, (PUINT) &uLen);
    
                  // Versionsnummer bilden
                  Result.Format("%d.%d.%d.%d",
                       HIWORD(FileInfo->dwProductVersionMS),
                       LOWORD(FileInfo->dwProductVersionMS),
                       HIWORD(FileInfo->dwProductVersionLS),
                       LOWORD(FileInfo->dwProductVersionLS));
    
                 // Speicher freigeben (ich bin mir nicht sicher, aber vermutlich zeigt FileInfo auf diesen Datenbereich)
                 delete [] pInfo;
              }
    
         return Result;
       }
    
    int main (void)
    {
    
    CString FileVersion = "Version: " + GetFileVersionString(":\\Dokumente und Einstellungen\\Hereich\\Desktop.test.exe");
    
    return 0;
    
    }
    


  • Vodn7V schrieb:

    er sagt zwar beim testen 0 Fehler

    Nicht beim "Testen", sondern beim Kompilieren.

    aber wenn ich es Ausführen will kommt immer:nker-Vorgang läuft...
    LINK : fatal error LNK1104: Datei "nafxcwd.lib" kann nicht geoeffnet werden
    Fehler beim Ausführen von link.exe.

    Nicht beim Ausführen, sondern beim Linken.

    Hast du in den Projekteinstellungen überhaupt die Benutzung der MFC aktiviert?



  • *in arbeit*



  • Dann geh mal auf die Linker-Einstellungen deines Projekts und ergänze dort die "version.lib" unter "Objekt-/Bibliothekmodule" (in der Datei sollten die angegebenen Symbole definiert sein).



  • UNGLAUBLICH !!!! Aber es funktioniert 🙂
    ich freu mich so 🙂

    VIELEN VIELEN DANK !!!!!!!

    Hier nochma der Code:

    #include<iostream>
    #include<afx.h>
    #include<string>
    #include<winver.h>
    
    using namespace std;
    
    CString GetFileVersionString(const CString &FileName)
       {
    
       char*  fname_1 = new char [FileName.GetLength() +1];
    
       strcpy(fname_1,FileName);
    
         // prüfen ob überhaupt Info da sind
         DWORD   nSize  = GetFileVersionInfoSize(fname_1, 0);
         CString Result = "";
    
         if (nSize)
               {
                  char *pInfo = new char[nSize];
    
                  // Versionsinfo auslesen
                  GetFileVersionInfo(fname_1, 0, nSize, pInfo);
    
                  VS_FIXEDFILEINFO *FileInfo;
                  UINT              uLen;
    
                   // Root-Information auslesen
    
                  VerQueryValue(pInfo, "\\", (void**) &FileInfo, (PUINT) &uLen);
    
                  // Versionsnummer bilden
                  Result.Format("%d.%d.%d.%d",
                       HIWORD(FileInfo->dwProductVersionMS),
                       LOWORD(FileInfo->dwProductVersionMS),
                       HIWORD(FileInfo->dwProductVersionLS),
                       LOWORD(FileInfo->dwProductVersionLS));
    
                 // Speicher freigeben (ich bin mir nicht sicher, aber vermutlich zeigt FileInfo auf diesen Datenbereich)
                 delete [] pInfo;
    
                }
    
         return Result;
    
       }
    
    int main (void)
    {
    
    CString FileVersion = "Version: " + GetFileVersionString("test.exe");
    
    printf("%s",FileVersion);
    
    return 0;
    
    }
    

Anmelden zum Antworten