C++ DLL Funktion exportieren mit __declspec(dllexport) geht nicht



  • Hallo Leute,

    ich habe eine DLL geschrieben, aus der eine Funktion exportiert werden soll. Normalerweise würde man das ja mit "__declspec(dllexport)" machen um sich eine .def-Datei zu sparen. Doch dies funktioniert bei mir nicht oder habe ich einen grundlegenden Fehler?

    #ifdef CHANGESOUNDDEVICENATIVE_EXPORTS
    #define CHANGESOUNDDEVICENATIVE_API __declspec(dllexport)
    #else
    #define CHANGESOUNDDEVICENATIVE_API __declspec(dllimport)
    #endif
    
    CHANGESOUNDDEVICENATIVE_API SoundDevicesManager *CreateSoundDevicesManager();
    

    Wenn ich nun dumpbin verwende bekomme ich dies:

    Dump of file ChangeSoundDevice.Native.dll
    
    File Type: DLL
    
      Summary
    
            3000 .data
            3000 .rdata
            2000 .reloc
            1000 .rsrc
            6000 .text
    

    Gruß cookie-exploit

    P.S.:
    Entwicklungsumgebung ist VS2010 und mein Betriebssystem ist Windows 7 Ultimate 64-Bit

    Codegenerierung = Multithreaded -> also kein .net



  • Und was genau ist jetzt das Problem? Probiers mal mit dumpbin /EXPORTS deine.dll 😉



  • Das Problem ist, das die Funktion nicht exportiert wird, wenn ich keine .def-Datei angeben, was ja eigentlich passieren sollte da ich "__declspec(dllexport)" verwende.

    Die Ausgabe, die ich ebend gepostet habe, war der Befehl "dumpbin /EXPORTS meine.dll".



  • Und CHANGESOUNDDEVICENATIVE_EXPORTS ist im dll Projekt auch definiert? Verwend __declspec(dllexport) mal direkt, um sicherzugehen...



  • Also sofern Visual Studio keine fehler macht eigentlich schon und ich habe es auch mal direkt davorgeschrieben, jedoch ohne Erfolg. 😞



  • Sehr merkwürdig. Und der Header mit dieser Deklaration wird in der dll auch eingebunden und die dll die du anschaust ist auch tatsächlich das aktuelle Kompilat?



  • Jap so sieht es aus, ist die aktuell gebaute DLL und auch die Header-Datei wird eingebunden.

    ChangeSoundDevice.cpp

    #include "stdafx.h"
    #include "ChangeSoundDevice.h" //Header-Datei mit der Exportfunktion
    
    SoundDevicesManager *CreateManager() {
    ...
    }
    

    dllmain.cpp

    #include "stdafx.h"
    #include "ChangeSoundDevice.h" //Header-Datei mit der Exportfunktion
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return TRUE;
    }
    

    Hier die Visual Studio ausgabe:

    1>------ Neues Erstellen gestartet: Projekt: ChangeSoundDevice.Native, Konfiguration: Release Win32 ------
    1>  stdafx.cpp
    1>  ChangeSoundDevice.cpp
    1>  SoundDevicesManagerImpl.cpp
    1>  dllmain.cpp
    1>  Code wird generiert.
    1>  Codegenerierung ist abgeschlossen.
    1>  ChangeSoundDevice.Native.vcxproj -> D:\Documents\Visual Studio 2010\Projects\ChangeSoundDevice\Release\ChangeSoundDevice.Native.dll
    ========== Alles neu erstellen: 1 erfolgreich, Fehler bei 0, 0 übersprungen ==========
    


  • Versuch mal, die Funktion auch bei der Definition als dllexport zu deklarieren...



  • Super, danke! Jetzt funktioniert es! 🙂

    EDIT: Ich Trottel, mir ist gerade aufgefallen, dass ich als ich die Funktion umbenannt habe, ich vergessen habe den Namen bei der Implementierung auch zu ändern. -.-

    Aber dank dir habe ich es ja herausgefunden! 😉


Anmelden zum Antworten