PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Win32 vs me - 'My documents'


zeckensack
2003-04-27, 01:42:21
Ich würde gerne eine systemweite Konfigurationsdatei im Home-Verzeichnis des gerade angemeldeten Benutzers abspeichern (so Multiuser-Support-Krams eben).

Nach einigem Gewühle im Platform SDK habe ich diesen Code geschrieben:

char home_dir[512];
home_dir[0]=0;
DWORD hrhr=ExpandEnvironmentStrings("%%HOMEPATH%%",home_dir,512);
FORCE_LOG_P("home dir: %s\n",home_dir);


Der funzt leider nicht auf Win98SE. HOMEPATH wird nicht expandiert, scheint dem System also nicht bekannt zu sein. Das hatte ich eigentlich auch befürchtet, nachdem ich in der Konsole mal kurz SET eingegeben hatte.

Watt nu?

Workaround 1:
die Datei ins Windows-Verzeichnis schmeißen (GetWindowsDirectory). Kotzt mich persönlich ziemlich an, wenn beliebige Programme dort ihren Müll fallen lassen, erscheint mir also kaum attraktiv. MU-Support unmöglich.

Workaround 2:
Registry. Na toll. Siehe oben.

Das ganze wird übrigens so ca 5kB an Strings benötigen, MS selbst hat irgendwann sogar mal davon abgeraten, solche Datenmengen in die Reg zu hauen (man solle doch bitte einen Verweis auf eine im Dateisystem lebende Konfig in die Registry schreiben, was IMO nun auch wieder überflüssig ist).

Ein regelrechtes 'eigenes' Verzeichnis habe ich übrigens auch nicht.



Bonusfrage:
Warum gibt's unter Win98SE GetModuleBaseName nicht, sondern nur GetModuleFileName (das Ergebnis muß ich dann wieder zu Fuß strippen).

Abe Ghiran
2003-04-27, 02:25:17
N'abend ;)

Also das was du da gepostet hast, funktioniert bei mir gar nicht (win2000+sp3), ich kriege bei

ExpandEnvironmentStrings("%%HOMEPATH%%",home_dir,512);

ein "\" zurück. Set in einer shell meint im übrigen das selbe.
Ich bin ja nu weiß Gott kein win32 Experte aber bei Microsoft würde ich ja vermuten, das sowas in der Registry zu finden ist. Und siehe da, unter

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

findet sich ein Schlüssel "Personal", in dem der Pfad zu "Eigene Dateien" abgelegt ist ("c:\Dokument und blablue\username\etc").
Ich habe keine Ahnung, ob es den Schlüssel auch unter win98 gibt, das herauszufinden überlasse ich mal dir (hab hier kein 98 mehr). Aber vielleicht ist das ja ne Möglichkeit an den Pfad zu kommen.

Grüße, Jan

zeckensack
2003-04-27, 02:33:27
Hey, das ja geil, danke :D

HOMEPATH hatte ich aus'm SDK. War ja klar, daß da wieder mal Stuß drinsteht :eyes:

GetWindowsDirectory
The GetWindowsDirectory function retrieves the path of the Windows directory. The Windows directory contains such files as Win32-based applications, initialization files, and help files.

UINT GetWindowsDirectory(
LPTSTR lpBuffer, // address of buffer for Windows directory
UINT uSize // size of directory buffer
);

<...>

Remarks
The Windows directory is the directory where an application should store initialization and help files. If the user is running a shared version of the system, the Windows directory is guaranteed to be private for each user.

If an application creates other files that it wants to store on a per-user basis, it should place them in the directory specified by the HOMEPATH environment variable. This directory will be different for each user, if so specified by an administrator, via the User Manager administrative tool. HOMEPATH always specifies either the user's home directory, which is guaranteed to be private for each user, or a default directory (for example, C:\USERS\DEFAULT) where the user will have all access.

Abe Ghiran
2003-04-27, 02:59:09
Hmmm, für den blödsinn der bei mir in HOMEPATH drinsteht, könnte natürlich auch ich selbst verantwortlich sein, no idea :).

SHGetFolderPath (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shgetfolderpath.asp) klingt auch gut, gibt es laut msdn seit win95 / nt 4 aufwärts. Sollte mit CSIDL_PERSONAL als zweitem Parameter auch den passenden Pfad zurückgeben.

Grüße, Jan

zeckensack
2003-04-27, 03:29:41
Originally posted by Abe Ghiran
Hmmm, für den blödsinn der bei mir in HOMEPATH drinsteht, könnte natürlich auch ich selbst verantwortlich sein, no idea :).

SHGetFolderPath (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shgetfolderpath.asp) klingt auch gut, gibt es laut msdn seit win95 / nt 4 aufwärts. Sollte mit CSIDL_PERSONAL als zweitem Parameter auch den passenden Pfad zurückgeben.

Grüße, Jan Thx :)

Ich glaube ich hol's mir trotzdem aus der Registry. Die Sachen die ich zu SHGetFolderPath gelesen habe, lassen mir die Haare zu Berge stehen.

So als kleines Highlight: Üpp (http://216.239.53.100/search?q=cache:4S4pW2jI5FIC:support.microsoft.com/%3Fkbid%3D303437+SHGetFolderPath&hl=en&ie=UTF-8)

Exxtreme
2003-05-25, 11:17:12
Originally posted by zeckensack

So als kleines Highlight: Üpp (http://216.239.53.100/search?q=cache:4S4pW2jI5FIC:support.microsoft.com/%3Fkbid%3D303437+SHGetFolderPath&hl=en&ie=UTF-8)
IEEEKKK!!!11

Ich hole es jetzt auch aus der Registry. :)

Haarmann
2003-05-29, 10:36:27
zeckensack

Win98 kennt kein userspezifisches Home (ev lässt es sich aber einschalten, aber da ich das nie getan hab, weil ichs nie gebraucht hab, kann ich das ned 100pro sagen). Da kann man die Variable auch ned gut setzen, denn sie zeigte ja auf nen Global "My Files" Ordner. Für Installer Pakete benutzt man drum sonst die Variablen. Allerdings arbeitet wohl ein Progger seltener mit sowas ;).

zeckensack
2003-05-29, 18:29:45
Original geschrieben von Haarmann
zeckensack

Win98 kennt kein userspezifisches Home (ev lässt es sich aber einschalten, aber da ich das nie getan hab, weil ichs nie gebraucht hab, kann ich das ned 100pro sagen). Da kann man die Variable auch ned gut setzen, denn sie zeigte ja auf nen Global "My Files" Ordner. Für Installer Pakete benutzt man drum sonst die Variablen. Allerdings arbeitet wohl ein Progger seltener mit sowas ;). Ich hätte halt gerne einen Weg gehabt, der unabhängig von der Windows-Version was brauchbares liefert. Ergo auf 98 (oder aber auch 2k/XP auf Single-User-Install; dort gibt's AFAIK auch keine Home-Verzeichnisse!) => "C:\Eigene Dateien\" oä, und ansonsten das Home-Verzeichnis.

Hab's mittlerweile anders gelöst, mit einem Registryverweis auf den gewählten Installationspfad :kotz:

Äh ja, ich bin nämlich ein Programmierer, der seiner Software auch funktionierende Installer spendieren möchte ;)