AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Erklärung zu Code gesucht...

Ein Thema von TheMiller · begonnen am 2. Nov 2006 · letzter Beitrag vom 16. Nov 2006
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Erklärung zu Code gesucht...

  Alt 2. Nov 2006, 20:04
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!
  Mit Zitat antworten Zitat
DocE

Registriert seit: 25. Mär 2004
108 Beiträge
 
#2

Re: Erklärung zu Code gesucht...

  Alt 2. Nov 2006, 20:11
N'Abend,

was genau verstehst Du denn nicht?

Grüsse
...Doc
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Erklärung zu Code gesucht...

  Alt 2. Nov 2006, 20:13
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
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#4

Re: Erklärung zu Code gesucht...

  Alt 2. Nov 2006, 20:14
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!
  Mit Zitat antworten Zitat
DocE

Registriert seit: 25. Mär 2004
108 Beiträge
 
#5

Re: Erklärung zu Code gesucht...

  Alt 2. Nov 2006, 20:19
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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#6

Re: Erklärung zu Code gesucht...

  Alt 2. Nov 2006, 20:22
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;
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#7

Re: Erklärung zu Code gesucht...

  Alt 2. Nov 2006, 20:24
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 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!
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#8

Re: Erklärung zu Code gesucht...

  Alt 16. Nov 2006, 18:03
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;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Erklärung zu Code gesucht...

  Alt 16. Nov 2006, 18:36
Bei mir lässt sich der Code in einem neuen DLL-Projekt problemlos kopieren.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#10

Re: Erklärung zu Code gesucht...

  Alt 16. Nov 2006, 18:41
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 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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz