![]() |
Re: aus c-Programm eine Delphi-dll aufrufen
sollte es nicht so heißen:
Code:
Alle C-Stringverarbeitungs-Funktionen sollten mit beidem eigentlich klarkommen.
*char c = func(...);
//oder char[80] c = func(...); //da solltens dann aber auch 80 sein. |
Re: aus c-Programm eine Delphi-dll aufrufen
Bei der Rückgabe eines PChars liegt das Problem mit dem Speichermanager vor. Die DLL alloziiert den Speicher für den String, du gibst die Adresse dessen zurück - aber beim verlassen der Funktion verliert der String seine Gültigkeit und der Speichermanager gibt den Platz wieder frei. Dies geschieht bei den Vorschlägen mit dem konstanten Array für die Rückgabe als Empfangsplatz genauso wie bei dem Vorschlag von sirius, welcher sogar offensichtlich einen temporären TypeCast durchführt.
Abhilfe würde hier nur die Übergabe eines entsprechend grossen Buffers helfen beim Aufruf, in welchen dann die Funktion diesen Rückgabestring reinlegt, wenn er denn genügend groß ist. Mehr zu dem Thema hatte Luckie mal sehr schön zusammen gefaßt: ![]() |
Re: aus c-Programm eine Delphi-dll aufrufen
Dass ein Result(!=lokale Variable) seine Gültigkeit verliert, wär mir neu - könnte aber durchaus sein, bei dem ganzen rumgewurschtle zwischen C und Delphi ;-)
|
Re: aus c-Programm eine Delphi-dll aufrufen
Zitat:
Delphi-Quellcode:
Und hier verliert der String seine Gültigkeit mit verlassen der Procedure, da die Variable aus einer Adresse besteht (da Pointer), welche ihre Gültigkeit behält und im Register übergeben wird. Nur halt an der Adresse steht nix mehr.
// Result vom Typ PChar!
Result := 'hallo ballo'; Result := PChar('hallo ballo'); |
Re: aus c-Programm eine Delphi-dll aufrufen
danke.
Man muss es also explizit alloziieren? Reicht da Setlength? |
Re: aus c-Programm eine Delphi-dll aufrufen
Hängt davon ab, wo der String definiert ist, welchen du mit SetLength() setzt.
a) Wenn der String lokal innerhalb der Funktion deklariert ist, klappt dies nicht. b) wenn der String global in der DLL deklariert ist würde es klappen. Dann kannst du auch einen temporären PChar() Typecast machen für das Result, weil durch die globale Variable in der DLL verliert der erzeugte Zeiger auf den String Inhalt nicht seine Gültigkeit mit verlassen der Procedure. |
Re: aus c-Programm eine Delphi-dll aufrufen
Zitat:
Anders wäre der Fall, wenn man eine Variable übergebn will (z.B. vom Stack), da müsste man in der DLL mit getmem/stralloc arbeiten und im C dann wieder "free"-n. Edit: Oi, hier gabs ja schon eine Seite zwei. Den letzten Eintrag @Muetze hatt ich noch nicht gelesen. Aber genau der, trifft ja auf die Fragestellung zu. |
Re: aus c-Programm eine Delphi-dll aufrufen
Zitat:
|
Re: aus c-Programm eine Delphi-dll aufrufen
Zitat:
|
Re: aus c-Programm eine Delphi-dll aufrufen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 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