Unterschiedliche Ordnernamen auf eine Datei durchsuchen
-
Hallo,
ich möchte die Version von Adobe Reader feststellen, dazu sollen die Eigenschaften der Datei AcroRd32.dll im Programmverzeichnis ausgelesen werden... Was fehlt ist die Prüfung ob diese datei überhaupt existiert,
je nach Version sieht es so aus:
C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.dll
C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.dll
C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.dll
...Wie kann ich das zuverlässig durchsuchen lassen?
Der Rest funktioniert schon ich komme nur nicht klar mit den unterschiedlichen Ordnernamen die auf den Rechnern sein könnten...=/
danke
-
boost::filesystem
-
Lese den Registry-Eintrag
HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Adobe Acrobat\X\Installer\Path
X ist die Version, die kann man an der Stelle gleich auslesen statt sie durch zu probieren. Eventuell musst du auf 32 vs 64 Bit achten (die haben dann andere Pfade wegen Wow6432Node usw.).
-
nwp3 schrieb:
Lese den Registry-Eintrag
HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Adobe Acrobat\X\Installer\Path
X ist die Version, die kann man an der Stelle gleich auslesen statt sie durch zu probieren. Eventuell musst du auf 32 vs 64 Bit achten (die haben dann andere Pfade wegen Wow6432Node usw.).
da ergibt sich für mich das gleiche problem, ich bin neu in c und überhaupt wenig programmiererfahrung. die version ist an der stelle genauso 9.0, 10.0 oder 11.0. wie komme ich mit den unterschiedlichen bezeichnungen zum ziel?
ich habe mir eben boost::filesystem angesehen(http://www.highscore.de/cpp/boost/dateisystem.html) und halte das für anfänger sehr komplex beschrieben.
da beim deinstallieren noch reste übrig bleiben (möglich das alle 3 ordner existieren) muss ich irgendwie die datei in den ordnern auf existenz prüfen, nur leider ist das leider nur schwerer als erhofft umzusetzen
-
Welche Sprache benutzt du denn? Du bist im C++-Forum und redest von C und benutzt wahrscheinlich CLI. Benutzt du die WinApi, .NET oder sonstwas? Oder ist dir alles egal, Hauptsache die Ordner sind weg?
Vielleicht möchtest du eine .bat-Datei:del /F /S /Q "C:\Program Files (x86)\Adobe\*"
-
so sieht der code aus:
{ nRetCode=GetVersionInfoString(_T("C:\\Program Files (x86)\\Adobe\\Reader 11.0\\Reader\\AcroRd32.dll"), _T("FileVersion"), strResultString); _tprintf("FileVersion=%s\n", strResultString.GetBuffer(0)); }
der pfad ist absolut, es soll jetzt an der stelle wo 11.0 steht das eingesetzt werden wo die AcroRd32.dll sich tatsächlich befindet, je nach version z.b. 9.0 oder 10.0...
ich kenne hauptsächlich php, html und mysql
-
_tprintf deutet auf C mit WinAPI hin, dann solltest du es vielleicht im C-Forum probieren. Oder bei WinAPI. Bei C++ könnte das so ungefähr aussehen:
#include <vector> #include <string> #ifdef UNICODE #define tstring wstring #define tstringstream wstringstream #else #define tstring string #define tstringstream stringstream #endif std::vector<std::tstring> getFolders(const std::tstring &path){ std::vector<std::tstring> files; WIN32_FIND_DATA WFD; HANDLE h = FindFirstFile(path.c_str(), &WFD); if (h == INVALID_HANDLE_VALUE) return files; do if (WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) files.push_back(WFD.cFileName); while (FindNextFile(h, &WFD)); FindClose(h); return files; } // ^ muss außerhalb einer Funktion, am Besten an den Anfang der Datei // v muss in deine Funktion rein for (auto & f : getFolders(_T("C:\\Program Files (x86)\\Adobe\\"))){ std::tstring dummy; std::tstringstream ss(f); int version; if (ss >> dummy >> version){ if (dummy == _T("Reader")){ MessageBoxA(0, std::to_string(version).c_str(), "Version:", MB_ICONEXCLAMATION); } } }
Wenn alles gut geht gibt das alle Versionen des Readers aus. Wenn er sagt "Datei vector nicht gefunden", gefolgt von vielen anderen Fehlermeldungen, dann hast du wohl C.
-
nach c&p an die entsprechenden stellen musste ich noch windows.h includieren, folgende fehler beim erstellen:
1>d:\test\getversion\getversion\getpathname.cpp(43): error C2143: Syntaxfehler: Es fehlt ',' vor ':' 1>d:\test\getversion\getversion\getpathname.cpp(43): error C2530: 'f': Verweise müssen initialisiert werden 1>d:\test\getversion\getversion\getpathname.cpp(43): error C3531: "f": Ein Symbol, dessen Typ "auto" enthält, muss einen Initialisierer aufweisen. 1>d:\test\getversion\getversion\getpathname.cpp(43): error C2143: Syntaxfehler: Es fehlt ';' vor '{' 1>d:\test\getversion\getversion\getpathname.cpp(45): error C2079: 'ss' verwendet undefiniertes class 'std::basic_stringstream<_Elem,_Traits,_Alloc>' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char>, 1> _Alloc=std::allocator<char> 1> ] 1>d:\test\getversion\getversion\getpathname.cpp(47): error C2678: Binärer Operator '>>': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'int' akzeptiert (oder keine geeignete Konvertierung möglich) 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1360): kann 'CArchive &operator >>(CArchive &,ATL::CTimeSpan &)' sein 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1367): oder "CArchive &operator >>(CArchive &,ATL::CTime &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1577): oder "CArchive &operator >>(CArchive &,CObject *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1578): oder "CArchive &operator >>(CArchive &,const CObject *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(67): oder "CArchive &operator >>(CArchive &,CByteArray *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(142): oder "CArchive &operator >>(CArchive &,CWordArray *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(217): oder "CArchive &operator >>(CArchive &,CDWordArray *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(438): oder "CArchive &operator >>(CArchive &,CObArray *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(513): oder "CArchive &operator >>(CArchive &,CStringArray *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(697): oder "CArchive &operator >>(CArchive &,CObList *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(798): oder "CArchive &operator >>(CArchive &,CStringList *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(1157): oder "CArchive &operator >>(CArchive &,CMapWordToOb *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(1324): oder "CArchive &operator >>(CArchive &,CMapStringToOb *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(1408): oder "CArchive &operator >>(CArchive &,CMapStringToString *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxwin.h(267): oder "CArchive &operator >>(CArchive &,SIZE &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxwin.h(268): oder "CArchive &operator >>(CArchive &,POINT &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxwin.h(269): oder "CArchive &operator >>(CArchive &,RECT &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(959): oder "CArchive &operator >>(CArchive &,COleVariant &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(963): oder "CArchive &operator >>(CArchive &,ATL::CComBSTR &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(1038): oder "CArchive &operator >>(CArchive &,COleCurrency &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(1045): oder "CArchive &operator >>(CArchive &,ATL::COleDateTime &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(1052): oder "CArchive &operator >>(CArchive &,ATL::COleDateTimeSpan &)" 1> bei Anpassung der Argumentliste '(int, std::string)' 1>d:\test\getversion\getversion\getpathname.cpp(49): error C2668: 'std::to_string': Mehrdeutiger Aufruf einer überladenen Funktion 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(688): kann 'std::string std::to_string(long double)' sein 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(680): oder "std::string std::to_string(_ULonglong)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(672): oder "std::string std::to_string(_Longlong)" 1> bei Anpassung der Argumentliste '(int)' 1>d:\test\getversion\getversion\getpathname.cpp(49): error C2228: Links von ".c_str" muss sich eine Klasse/Struktur/Union befinden. 1> 1>Fehler beim Erstellen 1> 1>Verstrichene Zeit 00:00:00.26 ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
#include "stdafx.h" #include <vector> #include <string> #include "Windows.h" #ifdef UNICODE #define tstring wstring #define tstringstream wstringstream #else #define tstring string #define tstringstream stringstream #endif std::vector<std::tstring> getFolders(const std::tstring &path){ std::vector<std::tstring> files; WIN32_FIND_DATA WFD; HANDLE h = FindFirstFile(path.c_str(), &WFD); if (h == INVALID_HANDLE_VALUE) return files; do if (WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) files.push_back(WFD.cFileName); while (FindNextFile(h, &WFD)); FindClose(h); return files; } /**************************************************************************\ extern char GetPathName // wird der teil überhaupt benötigt? ( char *pszFileName, char *pszSearchString, CString& strResultString, char strSearchPath, ) { for (auto & f : getFolders(_T("C:\\Program Files (x86)\\Adobe\\"))){ std::tstring dummy; std::tstringstream ss(f); int version; if (ss >> dummy >> version){ if (dummy == _T("Reader")){ MessageBoxA(0, std::to_string(version).c_str(), "Version:", MB_ICONEXCLAMATION); } } } } // end GetPathName
-
nach c&p an die entsprechenden stellen musste ich noch windows.h includieren, folgende fehler beim erstellen:
1>d:\test\getversion\getversion\getpathname.cpp(43): error C2143: Syntaxfehler: Es fehlt ',' vor ':' 1>d:\test\getversion\getversion\getpathname.cpp(43): error C2530: 'f': Verweise müssen initialisiert werden 1>d:\test\getversion\getversion\getpathname.cpp(43): error C3531: "f": Ein Symbol, dessen Typ "auto" enthält, muss einen Initialisierer aufweisen. 1>d:\test\getversion\getversion\getpathname.cpp(43): error C2143: Syntaxfehler: Es fehlt ';' vor '{' 1>d:\test\getversion\getversion\getpathname.cpp(45): error C2079: 'ss' verwendet undefiniertes class 'std::basic_stringstream<_Elem,_Traits,_Alloc>' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char>, 1> _Alloc=std::allocator<char> 1> ] 1>d:\test\getversion\getversion\getpathname.cpp(47): error C2678: Binärer Operator '>>': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'int' akzeptiert (oder keine geeignete Konvertierung möglich) 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1360): kann 'CArchive &operator >>(CArchive &,ATL::CTimeSpan &)' sein 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1367): oder "CArchive &operator >>(CArchive &,ATL::CTime &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1577): oder "CArchive &operator >>(CArchive &,CObject *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1578): oder "CArchive &operator >>(CArchive &,const CObject *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(67): oder "CArchive &operator >>(CArchive &,CByteArray *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(142): oder "CArchive &operator >>(CArchive &,CWordArray *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(217): oder "CArchive &operator >>(CArchive &,CDWordArray *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(438): oder "CArchive &operator >>(CArchive &,CObArray *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(513): oder "CArchive &operator >>(CArchive &,CStringArray *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(697): oder "CArchive &operator >>(CArchive &,CObList *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(798): oder "CArchive &operator >>(CArchive &,CStringList *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(1157): oder "CArchive &operator >>(CArchive &,CMapWordToOb *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(1324): oder "CArchive &operator >>(CArchive &,CMapStringToOb *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(1408): oder "CArchive &operator >>(CArchive &,CMapStringToString *&)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxwin.h(267): oder "CArchive &operator >>(CArchive &,SIZE &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxwin.h(268): oder "CArchive &operator >>(CArchive &,POINT &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxwin.h(269): oder "CArchive &operator >>(CArchive &,RECT &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(959): oder "CArchive &operator >>(CArchive &,COleVariant &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(963): oder "CArchive &operator >>(CArchive &,ATL::CComBSTR &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(1038): oder "CArchive &operator >>(CArchive &,COleCurrency &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(1045): oder "CArchive &operator >>(CArchive &,ATL::COleDateTime &)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(1052): oder "CArchive &operator >>(CArchive &,ATL::COleDateTimeSpan &)" 1> bei Anpassung der Argumentliste '(int, std::string)' 1>d:\test\getversion\getversion\getpathname.cpp(49): error C2668: 'std::to_string': Mehrdeutiger Aufruf einer überladenen Funktion 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(688): kann 'std::string std::to_string(long double)' sein 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(680): oder "std::string std::to_string(_ULonglong)" 1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(672): oder "std::string std::to_string(_Longlong)" 1> bei Anpassung der Argumentliste '(int)' 1>d:\test\getversion\getversion\getpathname.cpp(49): error C2228: Links von ".c_str" muss sich eine Klasse/Struktur/Union befinden. 1> 1>Fehler beim Erstellen 1> 1>Verstrichene Zeit 00:00:00.26 ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
#include "stdafx.h" #include <vector> #include <string> #include "Windows.h" #ifdef UNICODE #define tstring wstring #define tstringstream wstringstream #else #define tstring string #define tstringstream stringstream #endif std::vector<std::tstring> getFolders(const std::tstring &path){ std::vector<std::tstring> files; WIN32_FIND_DATA WFD; HANDLE h = FindFirstFile(path.c_str(), &WFD); if (h == INVALID_HANDLE_VALUE) return files; do if (WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) files.push_back(WFD.cFileName); while (FindNextFile(h, &WFD)); FindClose(h); return files; } /**************************************************************************\ extern char GetPathName // wird der teil überhaupt benötigt? ( char *pszFileName, char *pszSearchString, CString& strResultString, char strSearchPath, ) { for (auto & f : getFolders(_T("C:\\Program Files (x86)\\Adobe\\"))){ std::tstring dummy; std::tstringstream ss(f); int version; if (ss >> dummy >> version){ if (dummy == _T("Reader")){ MessageBoxA(0, std::to_string(version).c_str(), "Version:", MB_ICONEXCLAMATION); } } } } // end GetPathName
-
Benutzt du Visual Studio? Wenn ja welches?
Wahrscheinlich hast du ein VS2010, das kann noch keine so hübschen auto loops.Zeile 34:
for (auto & f : getFolders(_T("C:\\Program Files (x86)\\Adobe\\"))){
Ersetzen durch:
auto folders = getFolders(_T("C:\\Program Files (x86)\\Adobe\\")); for (auto f = begin(folders); f != end(folders); ++f){
-
ja es ist vs2010.
extern char GetPathName // > error code ( char *pszFileName, // < Filename Objekt char *pszSearchString, // < Suchstring CString& strResultString, // > Resource String char strSearchPath ) auto folders = getFolders(_T("C:\\Program Files (x86)\\Adobe\\")); for (auto f = begin(folders); f != end(folders); ++f){ std::tstring dummy; std::tstringstream ss(f); int version; if (ss >> dummy >> version){ if (dummy == _T("Reader")){ MessageBoxA(0, std::to_string(version).c_str(), "Version:", MB_ICONEXCLAMATION); } } } }
1>d:\test\getversion\getversion\getpathname.cpp(43): error C2059: Syntaxfehler: 'for' 1>d:\test\getversion\getversion\getpathname.cpp(43): error C2143: Syntaxfehler: Es fehlt ')' vor ';' 1>d:\test\getversion\getversion\getpathname.cpp(43): error C2143: Syntaxfehler: Es fehlt ';' vor '!=' 1>d:\test\getversion\getversion\getpathname.cpp(43): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. 1>d:\test\getversion\getversion\getpathname.cpp(43): error C2059: Syntaxfehler: '++' 1>d:\test\getversion\getversion\getpathname.cpp(43): error C2059: Syntaxfehler: ')' 1>d:\test\getversion\getversion\getpathname.cpp(43): error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil? 1>d:\test\getversion\getversion\getpathname.cpp(53): error C2059: Syntaxfehler: '}' 1>d:\test\getversion\getversion\getpathname.cpp(53): error C2143: Syntaxfehler: Es fehlt ';' vor '}' 1>d:\test\getversion\getversion\getpathname.cpp(53): error C2059: Syntaxfehler: '}' 1> 1>Fehler beim Erstellen 1> 1>Verstrichene Zeit 00:00:00.27 ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
danke für die hilfe bisher, ich konnte die syntaxfehler nicht selbst lösen das scheinen evtl. folgefehler zu sein? den code habe ich mit ausnahme der änderung belassen.
-
Ich hab fast alles gelöst:
extern char GetPathName // > error code ( char *pszFileName, // < Filename Objekt char *pszSearchString, // < Suchstring CString& strResultString, // > Resource String char strSearchPath ) ; auto folders = getFolders(_T("C:\\Program Files (x86)\\Adobe\\")); auto f = begin(folders); { for (f != end(folders); f++) { std::tstring dummy; std::tstringstream ss(f); int version; if (ss >> dummy >> version){ if (dummy == _T("Reader")){ MessageBoxA(0, std::to_string(version).c_str(), "Version:", MB_ICONEXCLAMATION); } } } }
1>d:\test\getversion\getversion\getpathname.cpp(46): error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil? 1> 1>Fehler beim Erstellen 1> 1>Verstrichene Zeit 00:00:00.27 ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
Sieht so aus, als wärst du mit C++/CLI unterwegs. Das ist eine andere Sprache als C++. Ich habe keine Ahnung wie man dort eine for-Schleife oder überhaupt irgendwas macht. Dafür gibts aber leicht verständliche Anfängertutorials.
-
Ok, trotzdem vielen Dank.
Was genau wird da eigentlich ausgegeben bzw. was passiert da?
Soweit ich das verstehe wird jeder Ordner druchgegangen und nach "Reader" im Namen gesucht, bei erfolg wird in einer Messagebox "Version:" ausgegeben.
Falls ja dann ist das nicht ganz richtig, dieser teil soll nicht die version herausfinden sondern in welchem ordner die AcroRd32.dll sich befindet.
-
*Push*
std::vector<std::tstring> getFolders(const std::tstring &path){ std::vector<std::tstring> files; WIN32_FIND_DATA WFD; HANDLE h = FindFirstFile(path.c_str(), &WFD); if (h == INVALID_HANDLE_VALUE) return files; do if (WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) files.push_back(WFD.cFileName); while (FindNextFile(h, &WFD)); FindClose(h); return files; } auto folders = getFolders(_T("C:\\Program Files (x86)\\Adobe\\")); for (auto f = begin(folders); f! = end(folders); f++) { std::tstring dummy; std::tstringstream ss(f); int version; if (ss >> dummy >> version){ if (dummy == _T("Reader")){ MessageBoxA(0, std::to_string(version).c_str(), "Version:", MB_OK); } } }
Was wird alles in der Messagebox ausgegeben und was bedeuten die einzelnen zeilen?
Einen Teil konnte ich mir zusammenreimen, aber nicht alles.
Laufen möchte es noch immer nicht
-
Das Problem ist, dass ich es nicht weiß. Ich kann dir sagen was es in C++ bedeutet, aber nicht was es in C++/CLI bedeutet. Die Sprachen sind so ein bisschen ähnlich, aber nicht gleich.
Ein vector ist sowas ähnliches wie ein Array, nur mit dynamischer Länge. getFolders nimmt einen String path und gibt dir einen vector (Array, Menge, Liste) von Ordnernamen in diesem Pfad zurück und benutzt dafür die Winapi. Da du Visual Studio benutzt solltest du auf einen beliebigen nicht selbst geschriebenen Teil des Codes klicken können, F1 drücken und die online-Hilfe für die entsprechende Funktion bekommen.
auto bedeutet, dass er sich den Datentyp selbst festlegen soll. auto folders = getFolders(...); legt eine neue Variable folders vom Typ des Rückgabetyps von getFolders an, was zufällig ein vector<tstring> ist.
Dann gehen wir alle Ordner durch und zerlegen den Namen in einen String und einen int. Bei "Reader 10.0" wäre das der String "Reader" und int 10. Damit kennen wir jetzt die Version. Dann wird die MessageBox aufpoppen, wahrscheinlich "Version: 9", "Version: 10", ....
Da wir nun die Versionen kennen, können wir die getFolders-Funktion anpassen und eine getFiles-Funktion draus machen, halt statt "WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY" ein "!(WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)" hinschreiben, dann bekommen wir die Dateien.
Ein paar Strings mit + zusammenfügen, also
_T("C:\\Program Files (x86)\\Adobe\\") + f + _T("\\Reader\\")
wobei f der aktuelle Ordnername aus der for-Schleife ist. Dann mit diesem Pfad getFiles aufrufen, durch alle Files genauso wie bei folders iterieren und prüfen, ob "AcroRd32.dll" dabei ist.
Die kleinen sprachlichen Unterschiede werden das schwieriger als nötig machen. Du kannst ein neues Programm schreiben, dass das in C++ macht, dann kann dir auch wer helfen. Und dann rufst du von CLI aus einfach das Programm auf. Oder du fragst jemanden, der C++/CLI kann, denn ich bin mir mittelmäßig sicher, dass ordentliches C++ miserables C++/CLI ist.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
nwp3 schrieb:
Sieht so aus, als wärst du mit C++/CLI unterwegs. Das ist eine andere Sprache als C++. Ich habe keine Ahnung wie man dort eine for-Schleife oder überhaupt irgendwas macht. Dafür gibts aber leicht verständliche Anfängertutorials.
Wie kommst du den da drauf? Das ist nicht C++/CLI sondern C++ unter Benutzung der Windows API.
@SeppJ, wenn schon dann ins WinAPI Forum. Vermutlich aber nicht mal das, denn es sind ja Syntax-Errors...