![]() |
Re: Erklärung zu Code gesucht...
Versuchs mal so:
Delphi-Quellcode:
--win32
function GetWinDir(): PChar; stdcall;
var tmp : String; begin SetLength(tmp, MAX_PATH); SetLength(tmp, GetWindowsDirectory(PChar(tmp), MAX_PATH)); result := pchar(tmp); end; |
Re: Erklärung zu Code gesucht...
Das funktioniert! Nur warum muss ich eine Zwischenvariable einfügen? Danke, gell!
|
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. |
Re: Erklärung zu Code gesucht...
Okay!
Danke euch allen |
Re: Erklärung zu Code gesucht...
Hallo du Schelm,
Zitat:
Freundliche Grüße |
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
Dieses Thema wurde von "Phoenix" von "Programmieren allgemein" nach "Windows API / MS.NET Framework API" verschoben.
Dat geht um API |
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:
Durch den statischen Array fällt zusätzlich noch das manuelle Allokieren von Speicher weg, das macht der Compiler für uns. :)
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; |
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! |
Re: Erklärung zu Code gesucht...
Zitat:
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. |
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