Post by Andre SokolewAußerdem kennt mein Delphi 5 die Funktion SHGetFolderPath
offenbar nicht.
Das ist ein Delphi-Mangel. Die Funktion ist auf allen Windows-Systemen ab
Windows 95 vorhanden, sofern mindestens der IE 5.0 installiert ist. Mein
D2005 kennt die Funktion allerdings auch nicht. Man kann allerdings auch die
Funktion SHGetSpecialFolderPath verwenden, zumindest die ist bei meinem
D2005 vorhanden.
Post by Andre SokolewMit einer eigenen external-Deklaration habe ich den Aufruf dann
hinbekommen, und die Funktion liefert auch das richtige Ergebnis
(zum Beispiel in eine Stringvariable), aber der Versuch, dieses
Ergebnis anschließend z.B. mit Showmessage darzustellen oder auch
nur Showmessage('Hallo') scheitern mit einer unerklärlichen
Zugriffsverletzung. Irgend etwas mache ich sicher falsch...
Du hast es erkannt ;-) Windows-API-Funktionen können mit Delphi-Strings
nichts anfangen. Du musst einen Puffer bereitstellen und einen Zeiger darauf
(PChar) übergeben. Man kann dafür die bereits erwähnte Funktion
SHGetSpecialFolderPath (die sich für das Vorhaben des OP übrigens auch sehr
gut eignet) als Vorbild nehmen. SHGetSpecialFolderPath ist in ShlObj.pas wie
folgt deklariert:
function SHGetSpecialFolderPath (hwndOwner : HWnd; lpszPath : PAnsiChar;
nFolder: Integer; fCreate : LongBool) : LongBool;
SHGetFolderPath kann entsprechend deklariert werden:
function SHGetFolderPath (hwndOwner : HWnd; nFolder : Integer;
hToken : THandle; dwFlags : DWORD; pszPath : PAnsiChar) : HResult;
Den mit lpszPath bzw. pszPath bezeichneten Puffer muss man vor dem Aufruf
der Funktion reservieren (auf ausreichende Größe achten!) und anschließend
ggf. in einen Delphi-String konvertieren. Dann sollte es auch keine
Schutzverletzungen geben.
Post by Andre SokolewDie Abfrage der Registry ist vergleichsweise einfach und vor allem
risikolos und funktioniert von Windows 95 bis (mindestens) Vista.
Ich habe zu Win3.1-Zeiten Programme geschrieben, die unter Windows XP immer
noch einwandfrei laufen. D. h. sie sind kompatibel zu mindestens 7
Windows-Versionen (Win3.1 - Win95 - Win98/SE - WinNT 4.0 - WinME - Win2k -
WinXP). Ich habe stets darauf geachtet, Windows-API-Funktionen zu verwenden.
Sogar ein 16bit-Midi-Sequencer für Windows 3.1 mit ausschließlich
Low-Level-Midiroutinen (nix mit MCI!) läuft dank konsequenter Verwendung von
API-Funktionen auch unter WinXP einwandfrei. Auch wenn ich heute ein
Programm schreibe, mache ich das so, dass es möglichst auf den nächsten 6
Betriebssystemversionen ebenfalls noch läuft. Nur bis Windows Vista in die
Zukunft zu sehen, halte ich daher für ein wenig kurzsichtig ;-)
Pfuschige Software hingegen erkennt man z. B. daran, dass sie auf einem
deutschen Windows plötzlich den Ordner "C:\Program Files" anlegen. Das muss
nicht sein, denn auf deutschen Windowsen heißt dieser Ordner bekanntlich
"C:\Programme". Auch fremdsprachige Programme finden diesen Ordner, wenn sie
die entsprechenden API-Funktionen verwenden, und legen nicht eigenmächtig
einen neuen an.
Gruß
Michael