DLL erstellen
-
Hallo,
Also ich bin gerade dabei, meine erste dll zu erstellen. Und zwar habe ich ein C++ Projekt mit ein paar klassen und würde diese gerne in ein C# (GUI) Projekt einbinden. Da man anscheinend keine klassen dirket einbinden kann, schreibe ich neue Methoden, damit ich die bestehenden Klassen verwenden kann. Mein Problem ist, dass ich auf eine Methode von einer bestehenden Klasse zugreifen will, ich aber folgende Fehlermeldung bekommen:
Error 1 error C2352: illegal call of non-static member functionNun hätte ich auch versucht meine Methode + den Variablen auf static zu setzen, hat auch nicht funktioniert.
mein C++ Code (h-file):
#include "meineganzenKlasse.h" #ifndef __MEINE_DLL_H__ #define __MEINE_DLL_H__ #ifdef __cplusplus extern "C" {__declspec(dllexport) #endif // Entry point into the dynamic-link library (DLL) BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved); // Here are my exported DLL functions __declspec(dllexport) void WINAPI start_game(); __declspec(dllexport) void WINAPI set_Parameter(int, int, int, int); #ifdef __cplusplus } #endif #endif /* __MEINE_DLL_H__ */mein C++ Code (cpp- File):
#include "meineDLL.h" #include <windows.h> //-------------DLLMAIN------------------------------------------ extern BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: // Code to run when the DLL is loaded break; case DLL_PROCESS_DETACH: // Code to run when the DLL is freed break; case DLL_THREAD_ATTACH: // Code to run when a thread is created // during the DLL's lifetime break; case DLL_THREAD_DETACH: // Code to run when a thread ends normally. break; } // everything fine return TRUE; } //eigene Methoden von einer anderen klasse aufrufen: extern void WINAPI start_game() { meineKlasse::eineMethode(); //dies Funktioniert } extern void WINAPI set_Parameter(int _a, int _b, int _c, int _d) { meineKlasse::meineMethode(_a, _b, _c, _d); //hier bekomme ich meine Fehlermeldung }meineKlasse.h static void meineMehode(int, int, int, int); meineKlasse.cpp void meineKlasse::meineMethode(int _a, int _b, int _c, int _d) { x=_a; //usw. }Wäre sper wenn mir jemand weiterhelfen könnte.
LG
-
Das geht deshalb nicht, weil Du der Funktion eine Instanz der Klasse übergeben musst. Die taucht zwar nicht explizit in der Parameterliste auf, wird aber übergeben.
Du könntest die Funktion vielleicht so schreiben:void set_Parameter(meineKlasse* cls, int _a, int _b, int _c, int _d) { cls.meineMethode(_a, _b, _c, _d); }Dann kannst Du von C# aus einen IntPtr auf die Klasse übergeben.
Dann noch was: "WINAPI" vor der Funktion klingt irgendwie komisch. Normal steht da so etwas wie DLLEXPORT oder so ähnlich vor. Habe aber gerade keinen eigenen Quellcode zum Nachgucken hier.
-
Danke Wirdbald, so hat's funktioniert....

bezüglich dem "WINAPI" ich hab mittlerweile einige unterschiedliche "Schlüsselwörter" gefunden, der Unterschied ist mir allerdings nicht klar, ich habe bloß einen Tipp von einem Bekannten bekommen und verwende deswegen WINAPI.
Sollte dies falsch sein, bitte kurz bescheid sagen und wenn möglich kurz erklären warum es falsch ist.Lg
-
Dieser Thread wurde von Moderator/in Phoemuex aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.