![]() |
C DLL in Delphi nutzen - AnsiString übergeben
Moin !
Ich habe hier nen Kollegen der versucht gerade eine C DLL zu proggen die ich dann in Delphi einbinden kann. Selber habe ich auch eine TestDLL geschrieben die ich problemlos nutzen kann:
Delphi-Quellcode:
Das ist mal der wichtigstes Teil meiner Dll. Und das würden wir gerne in C machen ...
Const DeviceName = 'Junsi iCharge 1010B+';
... Function GetDeviceName : AnsiString; begin GetDeviceName := DeviceName; end; Mein Kollege versucht nun einen AnsiString an meine Anwendung zu geben. Aber das klappt leider nicht. Kann jemand einen Tip geben wie man in C die DLL proggen müsste um der Delphi Anwendung eben einen AnsiString zu übergeben? |
Re: C DLL in Delphi nutzen - AnsiString übergeben
Lasst doch besser einen PAnsiChar zurückgeben.
|
Re: C DLL in Delphi nutzen - AnsiString übergeben
Und wie würde das praktisch in Delphi aussehen?
Also wie komme ich irgendwann wieder zu meinem String? |
Re: C DLL in Delphi nutzen - AnsiString übergeben
Ein einfacher Typecast genügt.
|
Re: C DLL in Delphi nutzen - AnsiString übergeben
Aber warum eigentlich PAnsiChar?
Müsste das nicht PAnsiString sein ?? |
Re: C DLL in Delphi nutzen - AnsiString übergeben
Das Grundproblem ist: Wer gibt den Speicher wieder frei. Also muss es auf C-Seite auch eine Funktion dafür geben, oder man muss sich etwas anderes einfallen lassen: 1) Der Aufrufer (Delphi) stellt den Speicher bereit und übergibt einen Puffer und dessen Größe oder 2) man verwendet Strings, die über eine gemeinsame Schnittstelle verwendet werden können (Delphis WideString ist eine Kapselung des OLE-Strings - auf C-Seite wäre dies ein BSTR (MSVC: _bstr_t) der mit SysAllocStringLen erzeugt werden kann).
|
Re: C DLL in Delphi nutzen - AnsiString übergeben
Wie unter 1) geschildert machen es auch viele API-Funktionen, z.B. ExpandEnvironmentStrings.
|
Re: C DLL in Delphi nutzen - AnsiString übergeben
Zu 2)
Versuche auf C-Seite erst gar nicht sowas zu machen:
Code:
Ja nach Compiler wird daraus intern unter Umständen:
BSTR Foo(...)
Code:
oder
void Foo(..., BSTR *AResult)
Code:
Man sollte nur void oder Ordinaltypen zurückgeben:
void Foo(BSTR *AResult, ...)
Code:
void Foo(..., BSTR *AResult)
Code:
DWORD Foo(..., BSTR *AResult)
Code:
HRESULT Foo(..., BSTR *AResult)
|
Re: C DLL in Delphi nutzen - AnsiString übergeben
Moin !
BSTR fällt wohl generell raus, denn mein Kollege hat kein MSVC sondern normales Ansi C. Zitat:
|
Re: C DLL in Delphi nutzen - AnsiString übergeben
Zitat:
Es ist ein Typ der im Windows-SDK definiert wird (siehe SysAllocStringLen). Zitat:
Delphi-Quellcode:
function GetDeviceName(ABuffer: PAnsiChar; ABufferSize: LongWord): LongWord; stdcall;
external '...' name '...';
Code:
uint32_t __stdcall GetDeviceName(char *a_Buffer, uint32_t a_BufferSize);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 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