Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DLL und übergabe von PChar (https://www.delphipraxis.net/180293-dll-und-uebergabe-von-pchar.html)

ATS3788 8. Mai 2014 11:51

Delphi-Version: XE

DLL und übergabe von PChar
 
Delphi-Quellcode:

function 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;
Hallo Delphianer
Ich bin mir nicht sicher ob das so richtig ist,
deshalb meine Frage.

Kann ich Strings so C Konform übergeben und abrufen ?

Sir Rufo 8. Mai 2014 12:14

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
http://msdn.microsoft.com/de-de/libr...(v=vs.85).aspx

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;

DeddyH 8. Mai 2014 12:16

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]

himitsu 8. Mai 2014 16:16

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 (Bei Google suchenGetWindowText)
- oder er fragt vorher die Größe des nötigen Speichers ab und reserviert ihn ebenfalls (GetWindowText + MSDN-Library durchsuchenGetWindowTextLength oder siehe das GetEnvironmentVariable-Beispiel)

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 Delphi-Referenz durchsuchenFreeMem)

oder jemand komplett Anderes kümmert sich um den Speicher
- hier könnte man z.B. den WideString verwenden (da drin verstecken sich dann MSDN-Library durchsuchenSysAllocStringLen und MSDN-Library durchsuchenSysFreeString)

ATS3788 9. Mai 2014 09:09

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 02:23 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