versionsnummer ermitteln
-
hallo,
ich bin noch recht neu was diese sprache angeht. muss aber irgendwie rausbekommen wie ich die versionsnummer auslesen kann.
ich habe mir schon etliche codes aus dem netzt gezogen jedoch hat es mit keinerm geklappt immer nur etliche fehlermeldungen. ich habe den code hier im forum gefunden und ihn so eingegeben auch wieder mit 3 fehlern. was mache ich falsch ?#include <windows.h> #include <string> #include <iostream> using namespace std; // 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; } int main (void) { AnsiString FileVersion = "Version: " + GetFileVersionString(:\Dokumente und Einstellungen\Hereich\Desktop.test.exe); }
-
Vodn7V schrieb:
hallo,
ich bin noch recht neu was diese sprache angeht. muss aber irgendwie rausbekommen wie ich die versionsnummer auslesen kann.
ich habe mir schon etliche codes aus dem netzt gezogen jedoch hat es mit keinerm geklappt immer nur etliche fehlermeldungen. ich habe den code hier im forum gefunden und ihn so eingegeben auch wieder mit 3 fehlern. was mache ich falsch ?#include <windows.h> #include <string> #include <iostream> using namespace std; // 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; } int main (void) { AnsiString FileVersion = "Version: " + GetFileVersionString(:\Dokumente und Einstellungen\Hereich\Desktop.test.exe); }
Kannst ud bitte auch dazusagen, was für Fehler das sind?
(einen sehe ich schon - der Parameter, den du an deine Funktion übergibst, ist Müll (da fehlen die Anführungszeichen))PS: Und AnsiString funktioniert nur auf dem Borland-Compiler. Womit arbeitest du?
-
achso tut mir leid, das wusste ich nicht. ich arbeite mit - microsoft visual c++ 6 -
fehler sind :
Fehlendes ';' vor Bezeichner 'GetFileVersionString'
Fehlende Speicherklasse oder Typbezeichner
fatal error C1004: Unerwartetes Dateiende gefundenvielen dank schonmal.
wieso geht das denn nur in borland. ist nicht c++ == c++ ?
-
Vodn7V schrieb:
wieso geht das denn nur in borland. ist nicht c++ == c++ ?
Ja, die Standard-Bibliothek von C++ gibt es überall, aber jeder Compiler-Hersteller baut noch ein paar eigene Zusatzbibliotheken und eigene Klassen dazu. AnsiString ist so eine Klasse, die Borland "erfunden" hat, Microsoft hat etwas ähnliches gebaut (nennt sich CString), außerdem gibt es noch die Standard-Klasse std::string für die Verarbeitung von C++-Strings.
PS: Da du mit Visual Studio arbeitest, empfehle ich hier CString's zu verwenden:
CString GetFileVersionInfo(const CString& 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; }
-
habe es genauso übernommen. jedoch sagt mir mein compiler noch genau die gleichen fehler an:
#include <windows.h> #include <string> #include <iostream> using namespace std; CString GetFileVersionInfo(const CString& 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) { CString FileVersion = "Version: " + GetFileVersionString(:\Dokumente und Einstellungen\Hereich\Desktop.test.exe); }
komme mir langsam schon ein bischen dumm vor aber ich habe mich wirklich versucht damit auseinanderzusetzen und so wie das is scheint das fuer mich auch (fast) allles logisch ...
.. oder muss ich noch irgendwas includen ? ich komme damit immer durcheinander mal mus man "bla.h" mal <bla> schreiben , mal geht nur das eine mal das andere. gibt es denn da feste regeln ? ich dachte .h wäre fuer c und das wäre dann in c++ weggelassen.
aber manchma muss ich trotzdem das .h hinmachen weil es sonst nicht geht.
-
Randfrage: In welcher Zeile sind die Fehler?
ich dachte .h wäre fuer c und das wäre dann in c++ weggelassen.
".h" ist die klassische Endung für Header-Dateien und gilt bei Compiler-eigenen (wie windows.h) und selbstgeschriebenen Headern auch weiterhin - lediglich die Header der C++ Standardbibliothek kommen offiziell ohne .h aus (und die Header der C Standardbibliothek wurden von <xyz.h> in <cxyz> gemappt).
PS: Der Fehler, den ich in der ersten Antwort genannt habe, besteht übrigens immer noch
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
ok danke. die anführungsstriche sind gesetzt
also alle fehler befinden sich in zeile 10 -->
alle in der ersten :CString GetFileVersionInfo(const CString& FileName)
-
Fehlender Header? (-> "include <afx.h>")
(alternativ nimmst du std::string, dafür hast du ja schon den passenden Header eingebaut - leider hat der kein Äquivalent zur Format()-Methode).
-
GetFileVersionInfo bzw. GetFileVersionInfoA' ist eine Api-Funktion und schon in winver.h definiert!
Du versuchst die Funktion neu zu definieren! Vor allem rufst du deine Funktion innerhalb nochmals auf
GetFileVersionInfo(FileName, 0, nSize, pInfo);
--> wir bestimmt ne Endlosschleife, oder woltest du hier die API aufrufen!
Gib deiner definierten Funktion mal nen neuen Namen!
-
also da ich noch nicht so firm darin bin habe ich mir den quellcode aus dem netzt kopiert. deswegen verstehe ich auch nicht alles kann nur in etwas erahnen was da passiert. ich habe die : #include <afx.h>
angefügt. jetzt ist das eine problem weg. dafuer aber 3 weitere da.\versioninfo.cpp(14) : error C2664: 'GetFileVersionInfoSizeA' : Konvertierung des Parameters 1 von 'const class CString' in 'char *' nicht moeglich
Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden
\versioninfo.cpp(22) : error C2665: 'GetFileVersionInfoA' : Durch keine der 2 Ueberladungen kann Parameter 1 vom Typ 'const class CString' konvertiert werden
\versioninfo.cpp(49) : error C2065: 'GetFileVersionString' : nichtdeklarierter Bezeichner
\versioninfo.cpp(49) : warning C4129: 'D' : Nicht erkannte Folge von Escape-Zeichen
\versioninfo.cpp(49) : warning C4129: 'H' : Nicht erkannte Folge von Escape-Zeichen
\Desktop\versioninfo.cpp(49) : warning C4129: 'D' : Nicht erkannte Folge von Escape-Zeichen
\Desktop\versioninfo.cpp(51) : warning C4508: 'main' : Funktion sollte einen Wert zurueckgeben; Ergebnistyp 'void' angenommen
Fehler beim Ausführen von cl.exe.EDIT: oder ist es besser nochmal ganz ander anzufangen ? gibt es etwas einfacheres oder besser gesagt verständlicheres fuer den anfang ?
danke
-
ich bekomme es einfach nicht hin
habe das ganze we dran gesessen aber jeden code den ich im net finde funtkioniert nicht. und selbst bekomme ich es nicht hin.
kann mir bitte jemand helfen ??
-
Dann schreib doch mal deinen aktuellen Code hierhin, vielleicht erleichtert das die Fehlersuche.
(was die "nicht erkannte Escapezeichen"-Fehler angeht - \ hat eine Spezialbedeutung in String-Literalen, wenn du es als Zeichen benötigst, mußt du es doppelt schreiben:
GetFileVersionString("C:\\Dokumente und Einstellungen\\Hereich\\Desktop.test.exe")
-
#include<iostream> #include<afx.h> using namespace std; class DatenKlau { public: void OnAuslesen(); }; void DatenKlau::OnAuslesen() { CString GetFileVersionInfo(const CString& 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) { CString FileVersion = "Version: " + GetFileVersionString(":\\okumente und Einstellungen\\Hereich\\Desktop.test.exe"); } }
Fehler :
c:\dokumente ...\dsyd.cpp(18) : error C2601: 'GetFileVersionInfoA' : Lokale Funktionsdefinitionen sind unzulaessig
c:\dokumente .......\dsyd.cpp(53) : error C2601: 'main' : Lokale Funktionsdefinitionen sind unzulaessig
Fehler beim Ausführen von cl.exe.dsyd.obj - 2 Fehler, 0 Warnung(en)
-
Du darfst in C++ Funktionen nicht verschachteln. Deine Einrückung ist übrigens grauenhaft.
-
#include<iostream> #include<afx.h> using namespace std; class DatenKlau { public: void OnAuslesen(); }; void DatenKlau::OnAuslesen() { CString GetFileVersionInfo(const CString& FileName) { // prüfen ob überhaupt Info da sind DWORD nSize = GetFileVersionInfoSize(FileName, 0); CString Result = ""; return Result; } int main (void) { CString FileVersion = "Version: " + GetFileVersionString(":\\Dokumente und Einstellungen\\Hereich\\Desktop.test.exe"); 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; } } }
habe es auch anders versucht. die fehler bleiben die gleichen.
ist der code denn sonst so korrekt ?
-
MFK schrieb:
Du darfst in C++ Funktionen nicht verschachteln.
Was ist an dieser Aussage nicht zu verstehen?
Du mußt die "GetFileVersionInfo()" (bist du sicher, daß die nicht "..String() heißen sollte?) aus der Datenklau::OnAuslesen() rausnehmen:
CString GetFileVersionString(const CString& fname) { ... } int main() { CString ver = GetFileVersionString(":\\Dokumente und Einstellungen\\Hereich\\Desktop.test.exe"); ... return 0; }
-
Zudem fehlt vor int main noch eine Klammer }.
Daher die Fehlermeldungen mit lokalen Funktionsdefinitionen.
-
Warum helft ihr jemandem beim Auslesen einer Versionsnummer der offensichtlich noch nicht mal C++ Grundlagen kann?
-
ich bin noch nicht lange dabei wie man sicherlich sehr schnell erkennen kann. ich habe jetzt 2 c++ bücher durchgearbeitet. mit fehlt einfach die praxis und dachte das ich mir durch solche aufgaben etwas mehr von dieser aneignen kann.
ich finde es sehr nett das mir so geholfen wird.