Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C DLL in Delphi nutzen - AnsiString übergeben (https://www.delphipraxis.net/125629-c-dll-delphi-nutzen-ansistring-uebergeben.html)

moelski 9. Dez 2008 10:56


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:
Const DeviceName = 'Junsi iCharge 1010B+';

...

Function GetDeviceName : AnsiString;
begin
  GetDeviceName := DeviceName;
end;
Das ist mal der wichtigstes Teil meiner Dll. Und das würden wir gerne in C machen ...

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?

DeddyH 9. Dez 2008 10:59

Re: C DLL in Delphi nutzen - AnsiString übergeben
 
Lasst doch besser einen PAnsiChar zurückgeben.

moelski 9. Dez 2008 11:00

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?

DeddyH 9. Dez 2008 11:01

Re: C DLL in Delphi nutzen - AnsiString übergeben
 
Ein einfacher Typecast genügt.

moelski 9. Dez 2008 11:07

Re: C DLL in Delphi nutzen - AnsiString übergeben
 
Aber warum eigentlich PAnsiChar?
Müsste das nicht PAnsiString sein ??

nicodex 9. Dez 2008 11:09

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).

DeddyH 9. Dez 2008 11:16

Re: C DLL in Delphi nutzen - AnsiString übergeben
 
Wie unter 1) geschildert machen es auch viele API-Funktionen, z.B. ExpandEnvironmentStrings.

nicodex 9. Dez 2008 11:33

Re: C DLL in Delphi nutzen - AnsiString übergeben
 
Zu 2)
Versuche auf C-Seite erst gar nicht sowas zu machen:
Code:
BSTR Foo(...)
Ja nach Compiler wird daraus intern unter Umständen:
Code:
void Foo(..., BSTR *AResult)
oder
Code:
void Foo(BSTR *AResult, ...)
Man sollte nur void oder Ordinaltypen zurückgeben:
Code:
void Foo(..., BSTR *AResult)
Code:
DWORD Foo(..., BSTR *AResult)
Code:
HRESULT Foo(..., BSTR *AResult)

moelski 9. Dez 2008 11:36

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:

1) Der Aufrufer (Delphi) stellt den Speicher bereit und übergibt einen Puffer und dessen Größe oder
Hat jemand mal ein Beispiel wie ich das dann unter Delphi implementieren muss?

nicodex 9. Dez 2008 11:45

Re: C DLL in Delphi nutzen - AnsiString übergeben
 
Zitat:

Zitat von moelski
BSTR fällt wohl generell raus, denn mein Kollege hat kein MSVC sondern normales Ansi C.

BSTR ist nicht Microsoft-Compiler-spezifisch (im Gegensatz zu _bstr_t).
Es ist ein Typ der im Windows-SDK definiert wird (siehe SysAllocStringLen).

Zitat:

Zitat von moelski
Zitat:

1) Der Aufrufer (Delphi) stellt den Speicher bereit und übergibt einen Puffer und dessen Größe oder
Hat jemand mal ein Beispiel wie ich das dann unter Delphi implementieren muss?

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 12:56 Uhr.
Seite 1 von 2  1 2      

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