.ini Dateien unter Win7
-
Das geht u.a. mit GetFullPathName (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364963%28v=vs.85%29.aspx)
-
Mit PathRemoveFileSpec kann man den Dateinamen entfernen
-
Alberich schrieb:
Hier muss ja nun noch der Dateiname entfernt und statt dessen der Name der .ini Datei (startup.ini) angefügt werden.
Japp.
Gibt es für char-Arrays so etwas wie substring(pos_begin, pos_end) und find_last_of() für strings um den Dateinamen der exe abschneiden zu können?
Nö. Aber es gibt ja std::string. Willst du std::string aus irgend einem Grund dafür nicht verwenden?
Ansonsten...
PathRemoveFileSpec EDIT: zu langsam *grmpf* /EDIT#include <windows.h> #include <shlwapi.h> // für PathRemoveFileSpec #pragma comment(lib, "shlwapi.lib") // für PathRemoveFileSpec // ... // TODO: check for errors TCHAR exeDirectory[MAX_PATH] = {}; // + 1 brauch ma nicht. Das = {} auch nicht, aber naja... hab's mir irgendwann angewöhnt so-gut-wie immer alles zu initialisieren. // Da hier nicht Performance-kritisch schadet es auch nicht. GetModuleFileName(NULL, exeDirectory, MAX_PATH); PathRemoveFileSpec(exeDirectory); // Macht Filenamen inklusive dem letzten "\" weg (modifiziert direkt den übergebenen Puffer) // Wenn schon TCHAR dann auch bei std::basic_string, sonst kompiliert das ja nichtmal mit UNICODE // (ggf. irgendwo in nem .h File ein nettes typedef std::basic_string<TCHAR> tstring; machen) std::basic_string<TCHAR> configFilePath = std::basic_string<TCHAR>(exeDirectory) + _T("\\startup.ini"); std::ifstream configFile(configFilePath.c_str()); // geht auch ohne extra .open() Zeile if (configFile) { // Inhalt der Datei startup.ini einlesen // configFile.close(); // kümmert sich der Destruktor drum, und bei ausschliesslich lesenden Zugriffen ist das auch vollkommen OK } else { std::cout<<"\nstartup.ini not found"; }
Bitte die ganzen zusätzlichen Anmerkungen nicht falsch verstehen. Wenns dich nicht interessiert überlies es einfach, falls doch hast du ein paar Tips was du besser/anders machen kannst.
-
hustbaer schrieb:
Bitte die ganzen zusätzlichen Anmerkungen nicht falsch verstehen. Wenns dich nicht interessiert überlies es einfach, falls doch hast du ein paar Tips was du besser/anders machen kannst.
Ganz im Gegenteil! Ich bin dankbar für jede Hilfe und Anmerkung! Dein Codebeispiel finde ich sehr lehrreich, leider spielt der Compiler/Linker nicht mit:
Zeile 4: warning: ignoring #pragma comment
Zeile 13: undefined reference to `_imp__PathRemoveFileSpecA@4'Ich verwende Code::Blocks (10.05).
-
#pragma comment(lib, "shlwapi.lib")
führt bei MS Visual C++ dazu, dass die "shlwapi.lib", die PathRemoveFileSpec enthält automatisch zu deinem Programm gelinkt wird. Bei CodeBlocks musst du sie wohl in den (Projekt-)Einstellungen eintragen.
-
gcc kann mittlerweile afaik das #pragma :).
-
OK, werd ich mir anschauen. Danke!
Habe noch ein bischen über das "Problem" nachgedacht und dieser Satz von hustbaer hat mich in die (hoffentlich
) richtige Richtung geschubst:
hustbaer schrieb:
[...] Aber es gibt ja std::string. Willst du std::string aus irgend einem Grund dafür nicht verwenden?
Es ist ja eigentlich schon alles da was ich brauche...
TCHAR EXEPath[ MAX_PATH ]; DWORD nChars = GetModuleFileName( NULL, EXEPath, MAX_PATH ); //in einen string schreiben std::basic_string<TCHAR> strPath; strPath.assign( &EXEPath[0], &EXEPath[nChars] ); //den Namen der .exe abschneiden strPath=strPath.substr( 0, strPath.find_last_of(_T("/\\")) ); //den Namen der .ini stattdessen anfügen strPath=strPath + _T("\\startup.ini"); //und wieder einen C-string draus machen std::ifstream configFile( strPath.c_str() ); if(configFile) { //lesen //configFile.close(); //Aber schaden würde das explizite schliessen auch nicht, oder doch? }
Gibt es gegen diese Lösung Einwände?
Alberich
-
//edit: Chupa Chups, LLLLösch mich!
-
Alberich schrieb:
std::basic_string<TCHAR> strPath; strPath.assign( &EXEPath[0], &EXEPath[nChars] );
Warum nicht gleich
[cpp]std::basic_string<TCHAR> strPath( EXEPath );
?
-
In der Kürze liegt die Würze!
Danke für den Hinweis, ich wusste nicht dass man das auch so zuweisen kann!