Spiel für Windows als Installationsversion
-
Hallo,
ich habe ein Spiel in C++ programmiert, und habe bisher mit portabler Struktur gearbeitet. Nun möchte ich das Programm installationsfähig für Windows (von XP an) bekommen.
Also, bisherige Struktur schaut in etwa so aus:
Spiel (Ordner)
- data (Ordner mit allgemeinen Daten)
- user (Ordner mit Benutzerdaten)
- Config.ini
- Spiel.exe
Wenn ich das ganze komplett unter C:\Programme installieren lasse, hat das Programm allerdings keine Schreibrechte auf die Daten (Win 7).
Die Idee ist nun also, die allgemeinen Daten unter %programdata% und die benutzerspezifischen unter %localappdata% zu speichern.
Problem dabei ist jedoch, dass Windows XP diese Verzeichnisse nicht hat und ich nicht weiß, wie ich am Besten gültige Verweise zu den Verzeichnissen bekomme.Für Windows-Benutzer, die noch keine Benutzerdaten haben, sollen dann neue angelegt werden. Es soll also nicht nur auf einen Benutzer beschränkt sein.
Für das Setupprogramm verwendet ich übrigens InnoSetup.
-
Innosetup kennt {localappdata}
Unter win7/win8: "C:\Users\{benutzername}\AppData\Local"
XP: meist: "C:\Documents and Settings\{benutzername}\Local Settings\Application Data"{commonappdata}
Unter win7/win8: "C:\Users\All Users\" bzw. "C:\ProgramData"
XP meist: "C:\Documents and Settings\All Users\Application Data"In die meisten benutzerspezifischen Ordner (also hauptsächlich die, die nicht mit "common" beginnen) sollte ein Installer am Besten gar nicht reinschreiben. Dateien in benutzerspezifischen Ordner sollte die installierte Anwendung beim ersten Start unter dem jeweiligen Benutzer erst anlegen:
msdn schrieb:
In “per-machine” installations, user data must be written at first run and not during the installation. This is because there is no correct user location to store data at time of installation. Attempts by an application to modify default association behaviors at a machine level after installation will be unsuccessful. Instead, defaults must be claimed on a per-user level, which prevents multiple users from overwriting each other's defaults.
siehe: http://go.microsoft.com/?linkid=9668061
Die Anwendung selbst kann an die Ordner drankommen via:
http://msdn.microsoft.com/de-de/library/windows/desktop/bb762181(v=vs.85).aspx
oder
http://msdn.microsoft.com/de-de/library/windows/desktop/bb762188(v=vs.85).aspxBei Spielen könnte vllt. auch das hier interessant sein (ab Vista):
http://msdn.microsoft.com/en-us/library/windows/desktop/ee417682(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ee417684(v=vs.85).aspx
-
Danke schonmal für die Antwort!
Also kann ich folgendes so verwenden, oder kann es damit Probleme geben?
// Allgemeine Daten char buffer[FILENAME_LENGTH]; SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, buffer); // ... // Benutzerdaten SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, buffer);
Vllt ist es sinnvoll, zusätzlich das Flag CSIDL_FLAG_CREATE zu verwenden!?
Wäre schlecht, wenn das Verzeichnis nicht existiert und das Spiel deshalb abbrechen muss.Ist es sinnvoll, Config-Daten und Logfiles unter Localappdata zu haben?
Ich weiß nicht, wo ich diese sonst unterbringen soll.