AGB  ·  Datenschutz  ·  Impressum  







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

DLL und übergabe von PChar

Ein Thema von ATS3788 · begonnen am 8. Mai 2014 · letzter Beitrag vom 9. Mai 2014
Antwort Antwort
Benutzerbild von ATS3788
ATS3788

Registriert seit: 18. Mär 2004
Ort: Kriftel
646 Beiträge
 
Delphi XE Starter
 
#1

DLL und übergabe von PChar

  Alt 8. Mai 2014, 12:51
Delphi-Version: XE
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 ?
Martin MIchael
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: DLL und übergabe von PChar

  Alt 8. Mai 2014, 13:14
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 8. Mai 2014 um 13:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#3

AW: DLL und übergabe von PChar

  Alt 8. Mai 2014, 13:16
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 [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.034 Beiträge
 
Delphi 12 Athens
 
#4

AW: DLL und übergabe von PChar

  Alt 8. Mai 2014, 17:16
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Mai 2014 um 17:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ATS3788
ATS3788

Registriert seit: 18. Mär 2004
Ort: Kriftel
646 Beiträge
 
Delphi XE Starter
 
#5

AW: DLL und übergabe von PChar

  Alt 9. Mai 2014, 10:09
Danke für die Antworten
Das muss ich erst mal verdauen.

Martin Michael
Martin MIchael
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:52 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