| Autor |
Nachricht |
Alberich
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.01.2011
Beiträge: 56
|
Alberich Mitglied
17:55:34 29.07.2012 Titel: |
.ini Dateien unter Win7 |
Zitieren |
Hallo zusammen! Hoffe meine Frage ist hier im richtigen Subforum gelandet...
Ich habe ein kleines Programm geschrieben welches beim Start eine .ini Datei zeilenweise einliest und so ein paar Parameter für den Programmstart bekommt. Das sieht ungefähr so aus:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 | std::ifstream CONF;
CONF.open("startup.ini");
if(CONF)
{
//Inhalt der Datei startup.ini einlesen
CONF.close();
}
else
{
MessageBox(NULL, "Error!\n\nstartup.ini not found\nloading default values", "Testprogram", MB_OK);
} | |
Die Datei startup.ini liegt natürlich im gleichen Verzeichnis wie das Programm. Das funktioniert soweit auch ganz gut (WinXP), jedoch berichtet mir ein Freund dass dieses Programm unter Win7 die .ini Datei nicht öffnen kann (die Messagebox erscheint). Dieser Freund berichtet mir auch dass er die .ini Datei nicht mit einem Doppelklick öffnen kann, Win7 sagt ihm dann dass er dafür nicht die nötige Berechtigung (oder so ähnlich) hat. Öfnnen der Datei aus einem Texteditor heraus funktioniert zwar, zum schnellen Editieren der Startwerte aber schon unpraktisch.
Kann es sein dass Win7 .ini Dateien besonders schützt? Ist im Grunde ja doch nur eine Text-Datei...
Alberich |
|
|
|
 |
..........
Unregistrierter
|
.......... Unregistrierter
18:07:19 29.07.2012 Titel: |
|
Zitieren |
|
 |
ehauser
Unregistrierter
|
ehauser Unregistrierter
19:02:44 29.07.2012 Titel: |
|
Zitieren |
Nein es ist egal ob die Datei .ini oder sonstwas ist.Aber seit Windows Vista können Programme ohne Adminrechte nicht mehr in C:\Programme schreiben. |
|
|
|
 |
Alberich
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.01.2011
Beiträge: 56
|
Alberich Mitglied
20:56:16 29.07.2012 Titel: |
|
Zitieren |
OK, sowas hatte ich mir auch schon fast gedacht. Aber das Programm schreibt gar nicht in die .ini sondern soll sie nur beim Start lesen.
Das Programm also mit Adminrechten starten und nicht in die Programme-Ordner packen.
Vielen Dank! |
|
|
|
 |
Patrickssj6
Mitglied
Benutzerprofil
Anmeldungsdatum: 08.01.2012
Beiträge: 100
|
Patrickssj6 Mitglied
00:03:36 30.07.2012 Titel: |
|
Zitieren |
Lass auch gleich am Besten das Programm Administrationsrechte anfordern |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 14217
|
Martin Richter Moderator
08:13:44 30.07.2012 Titel: |
|
Zitieren |
Ich würde mal sagen, dass Du nicht davon ausgehen, dass das aktuelle Verzeichnis Dein Programmverzeichnis ist. Deshalb wird die Datei nicht gefunden.
Verwende einen vollen Pfad und ermittle das Programmverzeihcnis mit GetModuleFilename |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
Scorcher24
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.12.2004
Beiträge: 2361
|
Scorcher24 Mitglied
12:08:25 30.07.2012 Titel: |
|
Zitieren |
| Alberich schrieb: | OK, sowas hatte ich mir auch schon fast gedacht. Aber das Programm schreibt gar nicht in die .ini sondern soll sie nur beim Start lesen.
Das Programm also mit Adminrechten starten und nicht in die Programme-Ordner packen. |
NEIN!
Machs richtig.
Lass dir von der WinAPI den %apppath% Ordner geben und erstelle dort einen eigenen Ordner mit deinen Einstellungsdateien.
Beispielcode aus einem Programm von mir:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | namespace fs = boost::filesystem;
#ifdef WIN32
# include <direct.h>
# include <shlobj.h>
# include <winerror.h>
#endif /* WIN32 */
#ifdef WIN32
static const char NLPathSep = '\\';
#else
static const char NLPathSep = '/';
#endif /* WIN32 */
void SystemController::findUserDataDir()
{
#ifdef WIN32
char dir[MAX_PATH];
HRESULT hr = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, dir); // <- Hier wird nach %apppath% gefragt, wo Einstellungen hinsollten
if ( hr == S_FALSE )
{
NLError("[SystemController] Critical Exception: Cannot find your Path to Application Data");
throw Exception("[SystemController] Critical Exception: Cannot find your Path to Application Data", true);
}
#else
char* dir = getenv("%home%");
#endif // WIN32
std::string r;
if ( m_vendor.empty() )
{
r = std::string(dir) + NLPathSep + std::string(".") + this->getAppName() + NLPathSep;
}
else
{
r = std::string(dir) + NLPathSep + std::string(".") + this->getVendorName() + NLPathSep + this->getAppName() + NLPathSep;
}
m_userpath = r;
}
bool SystemController::createUserDataDir()
{
if ( !fs::is_directory(this->getUserDataDir()) )
{
fs::create_directories(this->getUserDataDir());
if ( fs::is_directory(this->getUserDataDir()))
{
NLTrace(std::string("UserData-Directory created on path '") + this->getUserDataDir() + "'");
return true;
}
else
{
NLError(std::string("Could not create UserData-Directory on path '") + this->getUserDataDir() + "'");
return false;
}
}
return true; // Dir exists already
}
bool SystemController::userDataDirExists() const
{
return fs::is_directory(this->getUserDataDir());
} | |
Ich finde es eine sehr schlechte Gewohnheit wenn man wegen fehlender Rechte einfach nach diesen fragt obwohl man sie nicht braucht. Dateien die vom Nutzer modifiziert werden, gehören nach My Documents oder in den AppPath. |
_________________ Sometimes it pays to stay in bed in Monday, rather than spending the rest of the week debugging Monday's code. ~Dan Salomon
Meine Projekte
Zuletzt bearbeitet von Scorcher24 am 12:10:38 30.07.2012, insgesamt 1-mal bearbeitet |
|
 |
hustbaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16248
|
hustbaer Mitglied
13:18:21 30.07.2012 Titel: |
|
Zitieren |
| Scorcher24 schrieb: | | Ich finde es eine sehr schlechte Gewohnheit wenn man wegen fehlender Rechte einfach nach diesen fragt obwohl man sie nicht braucht. Dateien die vom Nutzer modifiziert werden, gehören nach My Documents oder in den AppPath. |
Danke |
_________________ "Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
|
|
 |
-guest-
Unregistrierter
|
-guest- Unregistrierter
14:31:14 30.07.2012 Titel: |
|
Zitieren |
@Scorcher24 und hustbaer
Grundsätzlich vollkommen korrekt
Nur:
| Zitat: | | Aber das Programm schreibt gar nicht in die .ini sondern soll sie nur beim Start lesen. | Laut dieser Aussage könnte es sich z.B. um eine Konfigurationsdatei handeln, die vom Installer erstellt wird und Grundeinstellungen zum Start beinhaltet.
Auf programmspezifische Dateien ohne Pfadangabe zuzugreifen, wie Martin Richter es schon sagte, geht meistens in die Hose. |
|
|
|
 |
hustbaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16248
|
hustbaer Mitglied
16:28:03 30.07.2012 Titel: |
|
Zitieren |
| -guest- schrieb: | Nur:
| Zitat: | | Aber das Programm schreibt gar nicht in die .ini sondern soll sie nur beim Start lesen. | Laut dieser Aussage könnte es sich z.B. um eine Konfigurationsdatei handeln, die vom Installer erstellt wird und Grundeinstellungen zum Start beinhaltet. |
Stimmt, ja. Dann gibt es erst recht keinen Grund Admin-Rechte zu verlangen.
Einfach den korrekten Pfad ermitteln (GetModuleFilename, hat Martin Richter ja schon geschrieben), und aufmachen.
Die mMn. wichtigen Punkte hier sind:
* Keine Admin-Rechte verlangen wenn nicht nötig
* Wenn man Einstellungen/... schreiben will, dann im passenden Verzeichnis (-> AppData) |
_________________ "Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
|
|
 |