![]() |
Erklärung zu Code gesucht...
Hallo,
ich habe hier einen Code zum Ermitteln des WinDirs. Der funzt prima. Doch ich verstehe nicht, wie er das Verzeichnis letztenendes bekommt, bzw was er macht. Möchte auch wissen, WAS ist programmiere *g*
Delphi-Quellcode:
Danke!
function GetWinDir: String;
const UNLEN = MAX_PATH; var Size: DWORD; begin Size := UNLEN + 1; SetLength(Result, Size); if GetWindowsDirectory(PChar(Result), Size) <> 0 then SetLength(Result, Size) else Result := ''; end; |
Re: Erklärung zu Code gesucht...
N'Abend,
was genau verstehst Du denn nicht? Grüsse ...Doc |
Re: Erklärung zu Code gesucht...
GetWindowsDirectory(PChar(Result), Size)
Müsste wohl der teil sein, der den Windows-Verzeichnisnamen ins Result kopiert. Weil die WinAPI ja nicht mit strings sondern mit pchars arbeitet, steht da noch die maximale länge des strings. (denk ich mal mit meinem halbwegs gesunden Menschenverstand *g*) Allerdings versteh ich nicht ganz, wieso da zweimal "setlength" steht o.O |
Re: Erklärung zu Code gesucht...
Sagen wir es mal so...
Der Befehl "GetWindowsDirectory" ist eine Funktion aus der KernlDll, oder? Aber wieso brauche ich dazu ein array? Und die Frage, die jetzt neu in den Raum kam, das verstehe ich auch nich! |
Re: Erklärung zu Code gesucht...
Es wird ja kein Array benutzt. Die Länge des Strings (result) wird auf die maximal mögliche Länge eines Pfadnamens + 1 gesetzt (und damit der Speicher reserviert). Vereinfacht könnte man auch schreiben:
Delphi-Quellcode:
Dann wird mit PChar(Result) die Adresse des Strings (im Speicher) an die Funktion "GetWindowsDirectory" übergeben, damit die dort den Pfad hineinschreiben kann.
function GetWinDir: String;
var Size: DWORD; begin Size := MAX_PATH + 1; SetLength(Result, Size); if GetWindowsDirectory(PChar(Result), Size) <> 0 then SetLength(Result, Size) // kann meines Erachtens weg else Result := ''; end; Und eigentlich müsste es auch so klappen:
Delphi-Quellcode:
function GetWinDir: String;
var Size: DWORD; begin Size := MAX_PATH + 1; SetLength(Result, Size); if GetWindowsDirectory(PChar(Result), Size) = 0 then Result := ''; end; Grüsse ...Doc |
Re: Erklärung zu Code gesucht...
Zitat:
Es sollte eher so aussehen:
Delphi-Quellcode:
function GetWinDir(): string;
begin // Reserviere direkt im Ergebnis den Speicherplatz für die Ausgabe der API-Funktion SetLength(Result, MAX_PATH); // Die API-Funktion füllt das Ergebnis und gibt die Länge zurück SetLength(Result, GetWindowsDirectory(PChar(Result), Length(Result))); end; |
Re: Erklärung zu Code gesucht...
Hm, und wenn ich diese Funktion jetzt in eine DLL packen will, nehme ich in der Deklaration PChar statt String. Doch dann kommt die Meldung
Zitat:
Danke! Den Code habe ich jetzt verstanden! @NicoDE: Das heabe ich jetzt auch gesehen. Habe ihn direkt aus dem Post von Luckie benutzt! |
Re: Erklärung zu Code gesucht...
Ich habe immernoch das Problem, dass die Fehlermeldung
Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden ausgegeben wird, aber nur, wenn die Funktion in der DLL steht. Bräuchte dazu nochmal Hilfe... Hier nochmal die Funktion:
Delphi-Quellcode:
function GetWinDir(): string;
begin // Reserviere direkt im Ergebnis den Speicherplatz für die Ausgabe der API-Funktion SetLength(Result, MAX_PATH); // Die API-Funktion füllt das Ergebnis und gibt die Länge zurück SetLength(Result, GetWindowsDirectory(PChar(Result), Length(Result))); end; |
Re: Erklärung zu Code gesucht...
Bei mir lässt sich der Code in einem neuen DLL-Projekt problemlos kopieren.
Grüße vom marabu |
Re: Erklärung zu Code gesucht...
Delphi-Quellcode:
library SysCtrl;
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt- Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL. Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String- Informationen als PChar- oder ShortString-Parameter übergeben. } uses ShareMem, Windows, Registry, SysUtils, Dialogs, Classes, ShellAPI; {$R *.res} function GetWinDir(): PChar; stdcall; begin // Reserviere direkt im Ergebnis den Speicherplatz für die Ausgabe der API-Funktion SetLength(Result, MAX_PATH); // Die API-Funktion füllt das Ergebnis und gibt die Länge zurück SetLength(Result, GetWindowsDirectory(PChar(Result), Length(Result))); end; exports GetWinDir; begin end. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz