Klasse aus DLL Funktion zurückgeben



  • Hi,

    ich hab mal wieder ein DLL Problem 🙄
    Ich möchte von einer DLL Funktion eine Klasse zurück geben.

    Hier mal mein Beispiel:

    DLL:

    #include <windows.h>
    #include <string>
    
    #define EXPORT __declspec (dllexport) 
    
    BOOL APIENTRY DllMain( HMODULE hModule,
    					  DWORD  ul_reason_for_call,
    					  LPVOID lpReserved
    					  )
    {
    	return TRUE;
    }
    
    EXPORT std::string GetName()
    {
    	return "Test";
    }
    

    So lad ich die GetName Funktion dann:

    typedef std::string (*GETNAME)();
    
    [...]
    
    GETNAME		PA_GetName;
    HINSTANCE			hDll;
    
    if(NULL != (hDll = LoadLibrary(dllName.c_str())))
    {
    	if(NULL != (PA_GetName = (GETNAME)GetProcAddress(hDll, "GetName")))
    	{
    		[...]
    	}
    	FreeLibrary(hDll);
    }
    

    PA_GetName ist NULL und GetLastError ist 127 (also Funktion nicht gefunden)

    Was ich jetzt schon probiert habe ist natürlich das extern "C" vor die Funktion.
    Dann bekomm ich aber vom Compiler diese Warnung und kann dann auch die Funktion nicht laden:
    warning C4190: 'GetName' hat C-Bindung angegeben, aber gibt UDT 'std::basic_string<_Elem,_Traits,_Ax>' zurück, was mit C inkompatibel ist

    Wenn ich das extern "C" nicht hab dann ist mir glaub ich auch klar das die Funktion nicht gefunden wird (wegen den anderen Symbolname die C++ Compiler generiert - oder?).

    So wie bekomm ich das Kind nun zum laufen 😃



  • Schaue mit dem Dependecy Walker wie der genaue Name der exportierten Funktion ist und benutze diesen Name bei GetProcAddress(...).

    http://www.dependencywalker.com/

    Wenn nicht C Exportiert wird, dann werden die Namen der Funktionen dekoriert um z.B. Überladung zu realisieren.

    Ausserdem ist es ratsam sich beim exportieren der Funktionen auf Grunddatentypen zu verlassen und nicht etwa komplexere Typen. Ansonsten muss sichergestellt werden, dass dieselbe Compiler / Linker Version verwendet wird (bei Library und Library Konsument).

    Grüssse Simon



  • Guck mal Hier



  • Danke, so was hab ich gesucht!



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply