Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

Win32.API 16. Nov 2006 17:48

Re: Erklärung zu Code gesucht...
 
Versuchs mal so:

Delphi-Quellcode:
function GetWinDir(): PChar; stdcall;
var tmp : String;
begin
  SetLength(tmp, MAX_PATH);
  SetLength(tmp, GetWindowsDirectory(PChar(tmp), MAX_PATH));
  result := pchar(tmp);
end;
--win32

TheMiller 16. Nov 2006 17:51

Re: Erklärung zu Code gesucht...
 
Das funktioniert! Nur warum muss ich eine Zwischenvariable einfügen? Danke, gell!

Win32.API 16. Nov 2006 17:57

Re: Erklärung zu Code gesucht...
 
Weil intern der Speicher fuer dich von Delphi reserviert und freigegeben wird.

Man koennte das Ganze auch per Hand machen und mit getmem und freemem dem Speicher selber reservieren.

TheMiller 16. Nov 2006 17:59

Re: Erklärung zu Code gesucht...
 
Okay!

Danke euch allen

marabu 16. Nov 2006 18:01

Re: Erklärung zu Code gesucht...
 
Hallo du Schelm,

Zitat:

Zitat von DJ-SPM
Nur warum muss ich eine Zwischenvariable einfügen?

du hast ab Beitrag #10 einfach kühn die Signatur deiner Funktion geändert!

Freundliche Grüße

TheMiller 16. Nov 2006 18:04

Re: Erklärung zu Code gesucht...
 
*fg*

Joa, hatte aber damit nix zu tun. Hatte es an allen Stellen geändert. Die Änderungen kamen durch verschiedene Tests. Daher.

DP-Maintenance 16. Nov 2006 18:08

DP-Maintenance
 
Dieses Thema wurde von "Phoenix" von "Programmieren allgemein" nach "Windows API / MS.NET Framework API" verschoben.
Dat geht um API

ste_ett 16. Nov 2006 18:10

Re: Erklärung zu Code gesucht...
 
Einen PChar als Rückgabewert zu benutzen, kann böse ins Auge gehen. :)
Der Speicher für die vier Byte für den Pointer sind zwar reserviert, nicht aber der Speicherbereich, auf den der PChar in deinem Fall verweisst.
Bei einem String ist das kein Problem, aber bei PChar kann es zu Fehlern führen, da der Speicher sofort wieder überschrieben werden kann. :)

Entweder allokierst du in der Funktion Speicher, der hinterher wieder freigegeben wird, oder du übergibst einen PChar mit geung Speicher. MAX_PATH wird hier von MS empfohlen.

Delphi-Quellcode:
function GetWinDir(WinDirPath: PChar): UINT;
begin
  Result := GetWindowsDirectory(@WinDirPath[0], MAX_PATH);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Dir: array[0..MAX_PATH-1] of char;
begin
  if (GetWinDir(@Dir[0]) >0) then
  begin
    ShowMessage(Dir);
  end
  else
  begin
    ShowMessage(SysErrorMessage(GetLastError));
  end;
end;
Durch den statischen Array fällt zusätzlich noch das manuelle Allokieren von Speicher weg, das macht der Compiler für uns. :)

TheMiller 16. Nov 2006 18:14

Re: Erklärung zu Code gesucht...
 
Also, die Funktion funktioniert einwandtfrei, so wie ich sie habe. Auch der Speicher sollte doch durch SetLength erst maximiert, dann auch die größe des Strings "zugeschnitten" werden. Und einen PChar kann ich doch bedenkenlos aus der DLL exportieren, oder nicht?

Also hier klappt alles!

ste_ett 16. Nov 2006 18:16

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

Zitat von DJ-SPM
Und einen PChar kann ich doch bedenkenlos aus der DLL exportieren, oder nicht?

Also hier klappt alles!

Nein, das geht nicht. :)
S. meinen Post oben.

Es kann gut gehen, aber solche Stellen sidn Fehlerquellen, wo man sich z.B. bei Multi-Threading tot sucht. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 Uhr.
Seite 2 von 3     12 3      

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