Autor Beitrag
NAP
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 18.11.10 16:57 
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

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.).

Für diesen Beitrag haben gedankt: NAP
NAP Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 19.11.10 09:16 
Ich hatte das befürchtet, aber gehofft, dass doch jemand ne andere Lösung hat ;-)
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 19.11.10 14:06 
Ganz so einfach ist das leider nicht, s. docwiki.embarcadero....ts#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...