versionsnummer ermitteln
-
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.
-
Außerdem ist dieses Forum ja auch dafür da. Jeder fängt mal klein an.
-
Paul_C. schrieb:
Außerdem ist dieses Forum ja auch dafür da. Jeder fängt mal klein an.
Dafür ist das Visual C++/MFC Forum mit Sicherheit nicht da.
-
was denn nu ?!
hatte es erst auch ins c++ forum gepostet aber es wurde dann hierher verschoben. also dafuer kann ich nichts. naja ich werd ma zusehen wie ich das noch hinbekomme.
-
Dein Problem ist hier schon ganz richtig. Aber du bist es IMHO nicht, weil du noch ziemlich große Lücken bei den Grundlagen hast. Deine Bücher können nicht so toll gewesen sein. Hier sind ein paar gute Tutorials verlinkt, vielleicht solltest du dir die mal antun.
-
ja ich habe mir am FR diese buch ersteigert. kann mit büchern irgendwie besser als mit tuts.
(C++ Objektorientiertes Programmieren von Anfang an)ich hoffe trotzdem das ihr mir bis dahin weiterhelfen könnt. wenn das buch da ist werde ich das erstmal durchackern. versprochen!!
#include<iostream> #include<afx.h> #include<string> using namespace std; CString GetFileVersionString(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"); return 0; }
c:\dokume.....pp(11) : 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
c:\dokumen....dsyd.cpp(19) : error C2664: 'GetFileVersionInfoA' : 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
Fehler beim Ausführen von cl.exe.dsyd.obj - 2 Fehler, 0 Warnung(en)
-
Du hast dir ein sehr schlechtes Buch bestellt.
-
wieso das denn ? ich dachte es sei grade gut für anfänger. habe viele gute sachen darüber gelesen. warscheinlich ist es auch geschmackssache oder ? nicht definitiv schlecht odeR?
-
Sowohl GetFileVersionInfoSize als auch GetFileVersionInfo brauchen den Dateinamen in einem Zeiger auf einen nicht konstanten TCHAR - warum, weiß ich nicht. Den bekommst du aber nicht so ohne weiteres aus einem CString.
Am besten legst du dir am Anfang ein hinreichend großes Array an und kopierst den Dateinamen da rein.
-
Oder const_cast?! In der Dokumentation steht ja das es nur ein in Parameter ist.
-
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*