![]() |
Delphi-Version: XE
DLL und übergabe von PChar
Delphi-Quellcode:
Hallo Delphianerfunction StrTest(const S1, S2 : PAnsiChar) : PAnsiChar; cdecl; implementation function StrTest(const S1, S2 : PAnsiChar) : PAnsiChar; var S3 : PAnsiChar; begin try GetMem(S3, StrLen(S1) + StrLen(S2) + 1 ); StrCopy(S3 , ''); StrCat(S3 , S1); StrCat(S3 , S2); Result := S3; finally FreeMem(S3); end; end; Ich bin mir nicht sicher ob das so richtig ist, deshalb meine Frage. Kann ich Strings so C Konform übergeben und abrufen ? |
AW: DLL und übergabe von PChar
Nein :)
Du lieferst einen Pointer auf ein Ansi-Zeichen zurück und gibts den Speicher auf den dieser Pointer verweist auch wieder frei. Was denkst du, was unter dem Pointer nun zu finden ist? So ist das leider nur ein Zufallsgenerator, der alles Mögliche produzieren kann. So, Spaß beiseite ... Der Aufrufer muss selber den Speicher für den Rückgabewert zur Verfügung stellen und sich um die Freigabe kümmern. Die Prozedur füllt dann einfach nur diesen Speicher. Beispiele finden sich im MSDN ![]() Dort wird ein (Pointer auf den) Buffer für die Rückgabe übergeben und auch die Größe des Buffers. Die Funktion füllt dann den Buffer. Hier ein Beispiel für den Aufruf
Delphi-Quellcode:
function GetEnvironmentVariable(const AEnvVar: string): string; var Len: Integer; begin Len:=Windows.GetEnvironmentVariable(Pchar(AEnvVar),nil,0) ;; if Len>0 then begin SetLength(Result, Len); Windows.GetEnvironmentVariable(Pchar(AEnvVar),PChar(Result), Len); end else begin Result:=''; RaiseLastWin32Error; end; end; |
AW: DLL und übergabe von PChar
Du weist Result einen Wert zu, den Du direkt im Anschluss wieder aus dem Speicher wirfst. Schau Dir doch mal Funktionen aus der Win32-API an, dort wird das meist so gemacht, dass der Speicher in der Hauptanwendung reserviert und mit einer Längenangabe als zusätzlichem Parameter an die DLL übergeben wird.
[edit] Diesmal hat der rote Kasten bei mir gepennt :lol: [/edit] |
AW: DLL und übergabe von PChar
Wie schon genannt, muß sich Einer um die Speicherverwaltung kümmern.
entweder der Aufrufer - der reserviert vorher den Speicher und gibt am Besten auch noch die Größe des Speichers mit ( ![]() - oder er fragt vorher die Größe des nötigen Speichers ab und reserviert ihn ebenfalls (GetWindowText + ![]() oder der Aufgerufene reserviert den Speicher - der Aufrufer muß dann hinterher über eine weitere Prozedur der DLL sagen, daß die den Pointer wieder freigeben muß (GetMem und ![]() oder jemand komplett Anderes kümmert sich um den Speicher - hier könnte man z.B. den WideString verwenden (da drin verstecken sich dann ![]() ![]() |
AW: DLL und übergabe von PChar
Danke für die Antworten
Das muss ich erst mal verdauen. Martin Michael |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:36 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