Hi Andre,
jetzt weiß ich, wo das Problem liegt. Die Funktionen, die du aufrufst, sind in Wirklichkeit Methoden einer Klasse und brauchen eine Instanz der Klasse Rsct_TerminalConnect (ein Objekt), um funktionieren zu können. Dieses Objekt ist eine Art „unsichtbarer“ Parameter des Einsprungpunkts in die DLL. Dieses muss zuerst erzeugt werden. In deinem C+±Beispiel geschieht das, ähnlich zu C#, mit „new“:
Rsct_TerminalConnect* pTC = new Rsct_TerminalConnect();
Danach können an diesem Objekt Methoden ausgeführt werden, „->“ funktioniert ähnlich dem Punkt in C#:
ret = pTC->Connect(GetPort());
Du wirst um in C geschriebene Wrapperfunktionen kaum herumkommen. Du kannst sie z.B. wie folgt gestalten:
Rsct_TerminalConnect* rsct_tc_new()
{
return new Rsct_TerminalConnect();
}
void rsct_tc_delete(Rsct_TerminalConnect* tc)
{
delete tc;
}
Diese zwei Funktionen dienen dem Anlegen und Zerstören eines Objekts des Typs Rsct_TerminalConnect. Der Aufruf von letzterer ist am Ende der Lebenszeit des Objekts notwendig, da unmanaged Speicher nicht automatisch freigegeben werden kann.
Dann für jede Methode (die du brauchst) wieder eine Wrapper-Funktion, die zusätzlich ein Objekt der Klasse übergeben bekommt:
int rsct_tc_Connect(Rsct_TerminalConnect *tc, int _port)
{
tc->Connect(_port);
}
Etc. Unter .Net werden aus den Parametern und Rückgabewerten des Typs Rsct_TerminalConnect * dann Objekte des Typs IntPtr, das heisst, du holst die Funtkionen deiner selbstgeschaffenene DLL wie folgt nach .NET:
[DllImport(…)]
extern int rsct_tc_Connect(IntPtr tc, int _port);
(ich kann leider nur C# ).
Jetzt musst du nur noch hinbekommen, in deiner IDE ein DLL-Projekt zu erzeugen, dort das Headerfile der Bibliothek zu inkludieren und die .lib-Datei der DLL zu verknüpfen, und vor alle Funktionsaufrufe __declspec(dllexport) zu schreiben, um die selbstgeschriebenen Funktionen als Einsprungpunkte der DLL zu exportieren.
Also im Endeffekt brauchst du eine .cpp-Datei mit folgendem Inhalt:
#include „blabla.h“
__declspec(dllexport) Rsct_TerminalConnect* rsct_tc_new()
{
return new Rsct_TerminalConnect();
}
[etc.]
Dann musst du einerseits der IDE beibringen, wo sie die .h-Datei findet und andererseits, dass es die .lib-Datei dazulinkt (und wo sie sie findet).
So… ich wünsche dir viel Erfolg. Ist bestimmt nicht einfach, aber geht vermutlich nicht anders. Es sei denn, du schaffst es herauszufinden, wie man ein C+±Objekt direkt von .NET aus erzeugt. Keine Ahnung, ob und wie das geht.
Viele Grüße,
Sebastian