Entwickler-Ecke

Basistechnologien - DLLIMPORT bcb dll mit AnsiString und Currency


NAP - Do 18.11.10 16:57
Titel: DLLIMPORT bcb dll mit AnsiString und Currency
Hallo,
ich muss ein paar Routinen aus einer alten in borland cpp builder geschriebenen dll in meinem c# Projekt verwenden.
Die alte dll lässt sich NICHT ändern.

folgende Funktion wird z.B. exportiert


Quelltext
1:
extern "C"__declspec(dllexport) __stdcall AnsiString Calc01 (Currency PR, AnsiString AT, int TA)                    


Mir fällt echt nix ein, wie ich die Routine über ein DLLIMPORT einbinden könnte


Quelltext
1:
2:
[DllImport("gebrah.dll", CharSet = CharSet.Ansi)]
static extern string Calc01(float PR, string AT, Int32 TA);


geht natürlich nicht. Denn float entspricht nicht Currency - aber was tut das?
Und string scheinbar auch nicht einem AnsiString insb. als Rückgabewert.

Hat irgendjemand einen Tipp?
Bin für jede Hilfe dankbar.

Mirko


Th69 - Do 18.11.10 19:26

Direkt wirst du das nicht so einfach hinkriegen, da du ja die Datentypen 'Currency' und 'AnsiString' in C# exakt nachbauen müßtest (Marshalling von Strukturen). Besser und einfacher wäre es, eine einfache C-DLL zu erstellen (bzw. falls du den Sourcecode der DLL hast, zusätzliche Funktionen zu erzeugen), welche nur POD-Datentypen verwenden (d.h. int, const char* etc.).


NAP - Fr 19.11.10 09:16

Ich hatte das befürchtet, aber gehofft, dass doch jemand ne andere Lösung hat ;-)


Greenberet - Fr 19.11.10 11:53

Andere Möglichkeiten wird es kaum geben( außer Pseudoparametern, aber das wird dir nicht viel helfen )

Hast du die Definitionen von Currency und AnsiString aus der DLL?

Meine Vermutung:
Currency = enum = int
AnsiString = char*

Wenn du die Definiton hast wäre es fast C&P in C#


Th69 - Fr 19.11.10 14:06

Ganz so einfach ist das leider nicht, s. http://docwiki.embarcadero.com/RADStudio/en/Internal_Data_Formats#The_Currency_type (bzw. unter Long String Types).

Es geht ja nicht nur um das reine Speicherlayout, sondern auch um die Auswertung der Daten, d.h. von C# aus müßte man die Currency sowie AnsiString auch korrekt auslesen bzw. erzeugen können...