Thema: Delphi XE2 übergabe an C DLL

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: XE2 übergabe an C DLL

  Alt 30. Jun 2014, 10:57
Alles nicht

Zitat:
Delphi-Quellcode:
function StrToDLL(s : String) : PAnsiChar;
begin
  result := PAnsiChar(s);
end;
Totaler Schrott und das sollte auch der Debugger bemängeln. (zumindestens ab Delphi 2009)

Zitat:
Delphi-Quellcode:
function StrToDLL(s : String) : PAnsiChar;
begin
  result := PAnsiChar(AnsiString(s));
end;
Typmäßig OK, aber dennoch Schrott.

Delphi legt hier eine lokale temporäre Variable an, wo der AnsiString reingeht, bevor PAnsiChar darauf angewendet wird.
Und jetzt ratet mal, was mit dieser Variable und deren Speicher bei Funktionsende passiert?

Richtig, der Zeiger ist futsch, da er auf was nicht mehr Existierendes zeigt.

Zitat:
Delphi-Quellcode:
function StrToDLL(s : AnsiString) : PAnsiChar;
begin
  result := PAnsiChar(s);
end;
Solange man einen AnsiString übergibt und solange man diesen AnsiString nicht mehr verändert und er auch immernoch existiert, kommt das StrToDLL(MyStr) auf ein PAnsiChar(MyStr) hinaus und die Funktion ist "nutzlos", aber benutzbar.

Übergibt man aber einen "anderen" String-Typen, dann war's das wieder und alles ist Schrott. (kann man nur etwas verhindern/eingränzen, indem man es als function StrToDLL(var s : AnsiString) : PAnsiChar; deklariert und so eine AnsiString-Variable als Parameter erzwingt)
$2B or not $2B
  Mit Zitat antworten Zitat