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 function
    

    Nun 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.


Anmelden zum Antworten