Tach zusammen!
Ich hab da mal eine kleine Frage: Es gibt hier ja ein sehr nützliches und auch wunderschönes, kleines Tutorial bzw. einen Tipp unter den FAQs, in dem erklärt wird wie man den Installationsordner von Windows bzw. das Systemverzeichnis herausfinden kann. Meistens braucht man ja genau diesen Pfad um ihn irgendwie weiter zu verwerten. Und genau dabei kann es zu Problemen kommen. Bei einer einfachen Ausgabe dieses Verzeichnis in einem Label oder sowas, ist das nicht so wild, weil die übrigen Zeichen eh nicht dargestellt werden... Aber ich fange wohl lieber vorne an: Ich glaube es ist von Tino und heißt....
...das Windows- & das Systemverzeichnis bekommen?. Das ist soweit auch ganz klasse, allerdings seh ich da ein kleines Problemchen. Aber vielleicht seh ich das auch nur, weil ich was falsch verstanden hab, deshalb korrigiert mich bitte in meinem Gedankenfehler.

Der Code ist in etwa folgender:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function GetWinDir: String; var Size: DWORD; begin Size := MAX_PATH + 1; SetLength(Result, Size); if GetWindowsDirectory(PChar(Result), Size) <> 0 then SetLength(Result, Size - 1) else Result := ''; end; |
Man definiert sich eine Funktion und setzt die Größe auf die maximale Länge, die ein Pfadname im jeweiligen System haben darf (+1, wegen Terminierung), damit es zu keinem Überlauf kommen kann. (Das steht ja soweit auch in der OH drin, aber wenn man sich das mal genau überlegt, ist eine Festlegung auf die maximale Pfadlänge totaler Quatsch, weil zumindest bei Windows wenigstens noch die Ordner z.B. "Dokumente und Einstellungen\Lokale Einstellungen" oder "System32" dem Basispfad angefügt werden müssen und deshalb niemals die gesamte Länge durch den Systempfad alleine ausgefüllt sein kann. Aber safety first!

) Dann über GetWindowsDirectory den Pfad holen, das Terminierungsbit wieder entfernen und als Result zurückliefern.
Im Normalfall sollte das Ganze C:\Windows ergeben. Was passiert jetzt aber mit den restlichen Zeichen, denn wir hatten Result ja eine Länge von, ich glaube im 32Bit-Windows sind es 260+1 Zeichen (260 nutzbare) gegeben? Nun, dort bleibt dann einfach der Wert drin stehen, der vorher bereits an dieser Speicherstelle stand. Kann man ganz einfach sehen, indem man mal ein
Showmessage(Result);oder ein
Showmessage(inttostr(sizeof(Result)));einbaut. Normalerweise bekommt man dann einen ellenlangen String zurück, der außer dem C:\Windows noch nicht sichtbare Zeichen enthält. Es sind also nicht einfach nur Leerzeichen, sondern irgendwas. D.h. ein simples
Result := Trim(Result)bringt also auch nicht wirklich was, da ja immer noch andere nicht sichtbare Zeichen im String sind. Was kann man also dagegen machen? Denn, wenn man den zurückgelieferten String z.B. um einen bestimmten Pfad ergänzen möchte und in die Registry schreiben möchte,also z.B.
RegVar.WriteString('',WinDir+'\System32\shell32.dll'), dann steht in dem Schlüssel nachher nur C:\Windows... drin, da ja die maximale Länge schon erreicht war. OK, man könnte WriteExpandString nehmen, aber das ist ja nur ein Beispiel.
Solution:
Wir füllen den String einfach vorher mit Leerzeichen auf und können diese dann nachher wieder abschneiden.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function GetWinDir: String; var Size: DWORD; begin Size := MAX_PATH + 1; SetLength(Result,Size); Result := StringOfChar(' ',MAX_PATH); if GetWindowsDirectory(PChar(Result),Size) <> 0 then begin SetLength(Result,Size - 1); Result := Trim(Result); end else Result := ''; end; |
Ich hoffe, ich hab's so ausgedrückt, daß man es verstehen kann.

Ansonsten nehme ich gerne Hinweise bzgl. des Verständnisses entgegen, auch falls ich was falsch verstanden hab.
