Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Erklärung zu Code gesucht... (https://www.delphipraxis.net/80086-erklaerung-zu-code-gesucht.html)

TheMiller 2. Nov 2006 19:04


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:
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;
Danke!

DocE 2. Nov 2006 19:11

Re: Erklärung zu Code gesucht...
 
N'Abend,

was genau verstehst Du denn nicht?

Grüsse
...Doc

Namenloser 2. Nov 2006 19:13

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

TheMiller 2. Nov 2006 19:14

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!

DocE 2. Nov 2006 19:19

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:
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;
Dann wird mit PChar(Result) die Adresse des Strings (im Speicher) an die Funktion "GetWindowsDirectory" übergeben, damit die dort den Pfad hineinschreiben kann.

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

NicoDE 2. Nov 2006 19:22

Re: Erklärung zu Code gesucht...
 
Zitat:

Zitat von DJ-SPM
Der funzt prima.

Nö, er erzeugt einen String mit vielen #0 am Ende.
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;

TheMiller 2. Nov 2006 19:24

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:

Zitat von Böser Compiler
Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden

Ist ja logisch, weil für den PChar ein reservierter Speicher erstellt wurde und der kann nicht variabel weitergegeben werden. Doch wie kann ich die Funktion jetzt doch in der DlL nutzen?

Danke! Den Code habe ich jetzt verstanden!

@NicoDE: Das heabe ich jetzt auch gesehen. Habe ihn direkt aus dem Post von Luckie benutzt!

TheMiller 16. Nov 2006 17:03

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;

marabu 16. Nov 2006 17:36

Re: Erklärung zu Code gesucht...
 
Bei mir lässt sich der Code in einem neuen DLL-Projekt problemlos kopieren.

Grüße vom marabu

TheMiller 16. Nov 2006 17:41

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:

Zitat von Compiler
[Fehler] SysCtrl.dpr(28): Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
[Fehler] SysCtrl.dpr(30): Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden

Das sagt er bei mir. Delphi 7 Enterprise WindowsXP Prof.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:32 Uhr.
Seite 1 von 3  1 23      

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