DLL laden



  • Hallo Leute,

    wie kann ich eine Dll laden. Ich hab zwar einiges im Netz gefunden aber es gab immer irgendwelche Fehler.

    Das ist der Code meiner Dll:

    // erstelleDLL.h
    namespace myNamespace{
    	extern __declspec(dllexport) int meinDLL();
    }
    
    // erstelleDLL.cpp
    #include "erstelleDLL.h"
    
    int myNamespace::meinDLL(){
    	return 888;
    }
    

    Und jetzt möchte ich die Funktion meinDLL() in einer Consoleanwendung benutzen.



  • Ich verweise mal ganz dezent auf die folgende Seite:
    http://tinyurl.com/ydxwnt5



  • Wie sehen die Fehler denn aus?
    Welcher Compiler wird benutzt?



  • Den Code habe ich schon überschrieben und mit dem Code kann gibts keine fehler beim Compiler aber wenn das Programm startet kommt ein Fehler:

    int main(){
    	typedef int (*pfunc)();
    	HMODULE mod = LoadLibrary(L"erstelleDLL.dll");
    
    	if(mod != NULL)
    		std::cout << "geladen" << std::endl;
    
    	pfunc func = (pfunc)(GetProcAddress(mod,"meinDLL"));		
    
    	int test = 0;
    	test = func();
    	std::cout << test;
    
    	FreeLibrary(mod);
    
        return 0;
    }
    

    Und ich mache das mit MS Visual C++ 08



  • ghostboss schrieb:

    Den Code habe ich schon überschrieben und mit dem Code kann gibts keine fehler beim Compiler aber wenn das Programm startet kommt ein Fehler:

    Soso ein Fehler also. Das ist ja sehr genau ...

    Lars



  • Ja. Ich starte das Programm und dann wird es auch ausgefüht und nach 1 - 2 sek. kommt dann der Fehler "programm.exe funktioniert nicht mehr ...".



  • Du prüfst nicht ausreichend auf NULL-Rückgabewerte.

    int main(){
    	typedef int (*pfunc)();
    	HMODULE mod = LoadLibrary(L"erstelleDLL.dll");
    
    	if(mod != NULL) {
    		std::cout << "geladen" << std::endl;
    
    		pfunc func = (pfunc)(GetProcAddress(mod,"meinDLL"));		
    
    		if (func) {
    			int test = 0;
    			test = func();
    			std::cout << test;
    		}
    
    		FreeLibrary(mod);
    	}
    
        return 0;
    }
    


  • Jo danke kein Fehler mehr aber wie kann ich jetzt auf die Funktion zugreifen, die in der Dll ist?



  • Les dir die Doku genauer durch!
    Das Symbol heißt außerdem nicht "meinDll" sondern "myNamespace::myDll".
    Ob das LoadLibrary kann, steht dann in der Doku. AFAIK geht das nicht, da LoadLibrary ne C-Funktion ist und da gibt es keinen namespace.
    Aber wie gesagt -> Doku von Microsoft...
    Ahaja, und ein extern "C" sollte die zu ladende Funktion auch bekommen. Jedenfalls ist das unter Linux so (dlopen), und ich denke auch Windows wird das so wollen.



  • Benutze den Dependency Walker um zu sehen wie der Name der exportierten Funktion genau heisst (bzw. ob überhaupt was exportiert wird):
    http://www.dependencywalker.com/

    Falls deine Funktion nicht extern "C" ist (*.def File würde das automatisch machen) ist der Name durch Name mangling verändert. Siehst Du aber schnell im DW.

    Ausserdem könnst Du für mehr info noch GetLastError() aufrufen.

    Simon


Anmelden zum Antworten