AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C DLL in Delphi nutzen - AnsiString übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

C DLL in Delphi nutzen - AnsiString übergeben

Ein Thema von moelski · begonnen am 9. Dez 2008 · letzter Beitrag vom 9. Dez 2008
Antwort Antwort
Seite 1 von 2  1 2      
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

C DLL in Delphi nutzen - AnsiString übergeben

  Alt 9. Dez 2008, 10:56
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?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: C DLL in Delphi nutzen - AnsiString übergeben

  Alt 9. Dez 2008, 10:59
Lasst doch besser einen PAnsiChar zurückgeben.
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
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: C DLL in Delphi nutzen - AnsiString übergeben

  Alt 9. Dez 2008, 11:00
Und wie würde das praktisch in Delphi aussehen?
Also wie komme ich irgendwann wieder zu meinem String?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: C DLL in Delphi nutzen - AnsiString übergeben

  Alt 9. Dez 2008, 11:01
Ein einfacher Typecast genügt.
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
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#5

Re: C DLL in Delphi nutzen - AnsiString übergeben

  Alt 9. Dez 2008, 11:07
Aber warum eigentlich PAnsiChar?
Müsste das nicht PAnsiString sein ??
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#6

Re: C DLL in Delphi nutzen - AnsiString übergeben

  Alt 9. Dez 2008, 11:09
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).
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: C DLL in Delphi nutzen - AnsiString übergeben

  Alt 9. Dez 2008, 11:16
Wie unter 1) geschildert machen es auch viele API-Funktionen, z.B. ExpandEnvironmentStrings.
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 nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#8

Re: C DLL in Delphi nutzen - AnsiString übergeben

  Alt 9. Dez 2008, 11:33
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)
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#9

Re: C DLL in Delphi nutzen - AnsiString übergeben

  Alt 9. Dez 2008, 11:36
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?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#10

Re: C DLL in Delphi nutzen - AnsiString übergeben

  Alt 9. Dez 2008, 11:45
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 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);
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:25 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