C++ DLL in anderer sprache benutzen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
close1
Beiträge: 39
Registriert: 9. April 2008 14:28
Kontaktdaten:

C++ DLL in anderer sprache benutzen

Beitrag von close1 »

Hi,

also ich habe folgendes Problem:

für ein kleineres Projekt würde ich gerne die funktionen einer Klasse in einer DLL exportieren;

das eigentliche Problem daran, ich muss alles mit external "C" exportieren damit es auch von anderen Programmiersprachen benutzbar bleibt.

meine Idee war einfach die klasse zu benutzen, und jeweils den konstruktor und alle methoden in jeweils andere funktionen zu schreiben,
etwa so:

Code: Alles auswählen

#include "my_class.h"
my_class myclass;
void init()
{
 myclass = new my_class();
}
void method_a()
{
myclass->method_a();
}
würde das funktionieren?

oder gibt es eine bessere Möglichkeit die Methoden zu exportieren?
MfG

close1
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ich versteh ned ganz was du willst ....

deshalb allgemein:

fuer funktionen ueber modulgrenzen (dll / .so) ist nur der C Teil binaer definiert. C++ elemente sind nicht definiert, d.h. da kann jeder compiler / version ihr eigenes sueppchen kochen (name mergling, parameter ausrichtung ... etc)

deshalb wirst du nie irgendwas was ne methode ist, ueber die schnittstelle schicken koennen, wenn sie compilerunabhaengig bleiben soll.

richtig ist, dass du mit normalen Funktionen das "Nachbilden" kannst.

d.h. du loest die objecte in nicht in eine funktionale Form (Handles + funktionen) aus. In C kann man ja genaugenommen auch "objectorientiert" programmieren, iss halt nur ned so schoen wie in C++.
weitere hinweise findest dazu im Inet.

Der Schluessel ist eigentlich, das man die objecte ueber sogenannte handles identifizeirt, die meist einfach nur die speicheradresse des Objects sind. Die dinger werden dann meist auch als untypisierter Zeiger definiert.

Code: Alles auswählen

typedef void * HandleT; 
wenn man nen Object erzeugen will, sieht das dann meist so aus
(am besten gleich richtig auf C - uebliche syntax mappen, also immer schoen den erfolg in form des reuckgabeparameters melden)

Code: Alles auswählen

int createObject(HandleT * pHandle, /*weitere optionen /*)
{
     // irgendwo dann das Object erzeugen 
     * pHandle = new MyClass;

     // und zum schluss
     return 0; 
}
ne methode aufrufen saehe dann so aus ...

Code: Alles auswählen

int myClass_DoSomething(HandleT handle)
{
     int ireturn = -1;
     if(handle)
     {
           reinterpret_cast<MyClass *>(handle)->doSomething();
           ireturn = 0;
     }
     return ireturn;
}
SO mach ichs zumindest immer, wenn ich funktionalitaet aus ner c++ lib compilerunabhaengig irgendwo zur verfuegung stellen muss.
COM (C- Schnittstelle !!! ) macht es uebrigens aehnlich (wenn inprozess) ! :-)

Wenn das zeugs in scriptsprachen (nicht c / c++ etc) verwenden willst, musst vielleicht nur noch auf die datentypen achten, manche Scriptsprachen kommen mit gewissen daten ned klar, weils nix da gibt ...bzw interpretieren das dann etwas anders ( vorzeichenlose 32 bit integers in Visual basic z.b. )

Hoffe das hilft bisserl ....

Ciao ...
close1
Beiträge: 39
Registriert: 9. April 2008 14:28
Kontaktdaten:

Beitrag von close1 »

also der export der funktionen ist dieser:

Code: Alles auswählen

 extern "C" __declspec(dllexport) __stdcall double addition(double arg1, double arg2)

{

    return arg1+arg2;

};
nun kann ich aus (fast) jeder anderen sprache diese Funktion aufrufen, indem ich die exportierte funktion "addition" aufrufe,

jedoch kann ich auf diese weise nicht die Funktionen von Klassen aufrufen :S
dazu suche ich eine elegante Lösung

darum geht es mir hierbei
MfG

close1
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

naja, elegant wird das soweiso nicht, da du die klassensyntax nicht ueber die schnittstelle bekommst. Du musst es wie oben beschrieben trennen und ueber handles gehen, um c compatibel zu bleiben ! Methodenaufrufe ueber C schnittstellen geht nicht.

geht es nur um eine scriptsprache ? wenn ja um welche ? Weil fuer einige gibt es C bindings, das heisst man kann mithilfe von wrappern und frameworks Objecte schreiben, die sich in der Scriptsprache wie interne Klassen / Instanzen verwenden lassen, aber das ist alles andere als trivial.

Alternative waere nen OO aufsatz fuer C (bzw mit binaerspezifizierten schnittstellen) der bei mehreren scriptsprachen funktioniert. unter windows gaebs da COM und .Net ....

Gib mal mehr eckdaten, bissi mehr infos zu deinem problem. So kann man nur sagen .. geht ned ! Wobei eleganz natuerlich sehr subjectiv ist :-)

Ich nehm an du hasst ne Lib/dll/project auf c++ klassenbasiert. Und suchst ne moeglichkeit, mit ner scriptsprache auf dieses zeugs zuzugreifen ... und das oben mit den handles gefaellt dir ned.
Welches BS ? welche Scriptsprache ?

Ciao ...
close1
Beiträge: 39
Registriert: 9. April 2008 14:28
Kontaktdaten:

Beitrag von close1 »

jo hast mich ertappt :oops:

ich will das für eine in delphi interpretierte scriptsprache übersetzen OS ist windows.

Eventuell währe es einfacher das ganze ohne Klasse zu machen aber das ist nicht das was ich im sinn hab, sonst könnt ich das ganze gleich in c schreiben :roll:

.net kann man knicken es werden nur vorkompilierte sprachen unterstützt; außerdem kann man nicht davon ausgehen das auf dem Endbenutzer Rechner .net installiert ist(das gleiche mit Java)

zudem ist das ganze jetzt schon recht komplex, und wenn ich dazu noch sagen würde das ich qt dynamisch einbinde :shock: naja einfach alle funktionen der klasse exportieren indem man funktionen schreibt deren Ihnalt nur die Funktion der Klasse ist wäre möglich, aber aufwändig und unschön :?


naja vielleicht weißt ja jemand ne Lösung hierfür
MfG

close1
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Eventuell währe es einfacher das ganze ohne Klasse zu machen aber das ist nicht das was ich im sinn hab, sonst könnt ich das ganze gleich in c schreiben
waer aber IMHO der weg des geringsten widerstandes, ergo der mit dem ueberschaubaren aufwand, wenn ich das richtig einschatze ...
ich will das für eine in delphi interpretierte scriptsprache übersetzen OS ist windows.
Was bitte ist das denn ? du hasst selber nen interpreter fuer ne scriptsprache in delphi geschrieben ? oder gibt es da fertige dinger ?

bist du an die scriptsprache gebunden ?
wenn nein, schau dir Python an, da gibts C++ bindings, QT bindings (mann kann qt direkt in python scripts verwenden) und es gibt auch bibs fuer c++ wo man nen interpreter fuer python in nem c++ project einbinden kann, um selber ne scriptschnittstelle zu seinem programm anbieten zu koennen.
Obs was fuer delphi gibt, k.a. ....

Ciao ...
close1
Beiträge: 39
Registriert: 9. April 2008 14:28
Kontaktdaten:

Beitrag von close1 »

nein die skriptsprache gibts schon, nun ja weiß nicht ob es einfacher währe in c zu arbeiten, da ich die QT library benutzen will :?

und ja ich bin (nicht direkt) an die sprache gebunden, ist halt für den "Game Maker" wollte für die deutsche community eine Erweiterung schreiben :)

Im großen und ganzen hatte ich folgendes vor:

die tcpip funktionen von QT einfach in einer DLL bereitstzuellen

und dazu einen linux server schreiben :oops:(*close1 hat wenig ahnung von linux) hab mir sogar das buch über QT4 geholt(Galileo Press) dort ist die Server client communikation ja sehr gut beschrieben(wie ich im Buch eines Bekannten feststellte)
MfG

close1
Antworten