DLL wärend der Laufzeit laden. Funktion findet Export in der dll nicht.



  • Hallo,

    ich möchte eine dll in meinem Programm laden. Leider findet dieses den export in der dll nicht. Bin noch Anfänger und bin über jede Art von Hilfe glücklich.

    Code Auszug der dll

    #define extern "C" __declspec(dllexport) void LoadShellDll()
    
    void startdll()
    {
    	int iPort = 3000;
    
    	DWORD dwThread;
    	HANDLE hThread;
    
    	// Shell-Thread starten:
    	hThread = CreateThread(NULL, 0, Shell, (void*)iPort, 0, &dwThread);
    
    	if(hThread)
    	{
            WaitForSingleObject(hThread, INFINITE);
    	CloseHandle(hThread);
    	}
        return;
    }
    
    __declspec(dllexport) void LoadShellDll()
    {
        startdll();
        return;
    }
    

    Codeauszug der funktion zum laden der dll.

    typedef void (*LoadShellDll)();
    
    void OpenShell()
    {
        LoadShellDll sDll;
    
        HMODULE hmod = LoadLibrary(SHELL_DLL);
    
            if(hmod==NULL)
    	    {
    			outerror(OUTERROR_TYPE_WARN_LOUD,"Konnte " SHELL_DLL " nicht finden.");
    		}
    		else
    		{
    			sDll = (LoadShellDll)GetProcAddress(hmod,"LoadShellDll");
    		if (!sDll) 
    		{
    			outerror(OUTERROR_TYPE_WARN_LOUD,"Konnte funktion LoadShellDll nicht finden.");
    			FreeLibrary(hmod); 
    		}
    		else
    		{
    			sDll();
    			FreeLibrary(hmod);
    		}
    	}
    }
    

    Fehler:
    Konnte funktion LoadShellDll nicht finden.

    Obwohl in der dll vorhanden. Habe auch schon mit PEID die dll untersucht und festgestellt, dass der export auf jedenfall vorhanden ist.



  • So?

    extern "C" __declspec(dllexport) void LoadShellDll()
    // ...
    


  • Sorry die zeile hatte ich hier vergessen mit anzugeben. Das scheint es nicht zu sein.



  • Also, das auch net:

    #define extern "C" __declspec(dllexport) void LoadShellDll()
    


  • nope will nicht.



  • Ja, was soll das #define an der Stelle?



  • ohne bekomme ich fehler beim kompilieren. Wie gesagt bin noch Anfänger. Was würdest du vorschlagen?



  • Aha, Anfänger... Die fehlenden Infos kannste dir ja immer noch besorgen: http://msdn.microsoft.com/en-us/library/ms682592(VS.85).aspx



  • sDll = (LoadShellDll)GetProcAddress(hmod,"LoadShellDll");
    
     if (!sDll) // <- Hier ist das Problem
     {
      ...
     }
     else
     {
      ...
     }
    

    Wann geht der denn nun in den if-Zweig?

    [] wenn sDll != 0 (-> GetProcAddress war erfolgreich)

    [] wenn sDll == 0 (-> GetProcAddress hat die Funktion nicht gefunden)



  • +gjm+ schrieb:

    sDll = (LoadShellDll)GetProcAddress(hmod,"LoadShellDll");
    
     if (!sDll) // <- Hier ist das Problem
     {
      ...
     }
     else
     {
      ...
     }
    

    Wann geht der denn nun in den if-Zweig?

    [] wenn sDll != 0 (-> GetProcAddress war erfolgreich)

    [] wenn sDll == 0 (-> GetProcAddress hat die Funktion nicht gefunden)

    Auf was willst du hinaus?



  • extern "C" {
    void __declspec(dllexport) __stdcall LoadShellDll(void);
    }
    void __declspec(dllexport) __stdcall LoadShellDll(void){ 
    startdll();
        return;
    }
    

    und dann

    typedef void (__stdcall *LoadShellDll)(void);
    LoadShellDLL sDLL;
    
    HANDLE hmod=LoadLibrary("Shell.dll");
    sDLL=(LoadShellDLL)GetProcaddress(hmod,"ShellFunction");
    if(!sDLL){
      printf("<EF> Cant find function [Shell.dll] %08X!\n",GetLastError()); 
    }
    etc.
    ....
    ..
    .
    

    so müsst ca. hinhaun



  • vielleicht prüfst auch noch

    if(!hmod){ //ErrorMessage dll not found mit GetLastError() }
    

    ob deine dll auch geladen wir


Anmelden zum Antworten