Dll LoadLibrary will nich.?



  • Guten Morgen, ich will eine Dll laden... Die Dll - ist im System32 verzeichniss, und hab sie auch noch in mein Projektverzeichnis kopiert.

    include "stdafx.h"
    #include "tagReader2.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // The one and only application object
    
    CWinApp theApp;
    
    using namespace std;
    
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    
    	// initialize MFC and print and error on failure
    	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    	{
    		// TODO: change error code to suit your needs
    		_tprintf(_T("Fatal Error: MFC initialization failed\n"));
    		return  1;
    	}
    	// PATH TO SYSTEM
    	HWND hwndOwner = NULL;
    	char szPath[MAX_PATH];
    	szPath[0]='\0';
    	int nFolder=CSIDL_SYSTEM; // Sytem32 Fodler
    	BOOL fCreate = 0; // no folder creation
    	BOOL bErgeb = SHGetSpecialFolderPath(hwndOwner,szPath,nFolder,fCreate);
    	CString szTheDll = _T("");
    	szTheDll.Format("%s", szPath);
    	szTheDll +="\\RenaLibrary.dll";
    
    	HANDLE m_hHandle = NULL;;
    	HMODULE m_hModule = NULL;;
    
    	if (m_hModule == NULL) {
    		m_hModule = LoadLibraryEx(szTheDll,m_hHandle,NULL);
    		if (m_hModule == NULL) { 
    			TRACE("\nCANT LOAD");
    			FreeLibrary(m_hModule);
    			return false;
    		}
    		else{
    			TRACE("\nLOADED LIBARY");
    
    // Beispiel eines Loads Syntax Modul
    
    // funcname_name = (TYPEfuncName)          GetProcAddress(m_hModule,"GetTagBit");
    
    // func_uid = (TYPEfuncID)           GetProcAddress(m_hModule,"GetTagChar");
    
    		}
    	}
    	return 0;
    }
    

    aber das Modul handle ist immer NULL.. kann mir das einer erklären.. der DLL namen stimmt 100% und das Systemverzeichnis auch.



  • Über 3000 Beiträge, und noch immer die Basics der Fehlersuche nicht gelernt?

    GetLastError.



  • GetLastError -> "ERROR_DLL_INIT_FAILED" hilft mir ja nich weiter, das er die dll nich laden kann is mir klar^^ Projekteinstellungen etc. sind ja nich notwendig oder wenn ichdas ding dynamisch lade... was für ein Anfänger fehler könnte ich noch gemaht haben, was habe ich evtl. übersehen 😉



  • Häufige Fehlerquelle:
    die DLL ist mit anderen DLLs verknüpft und kann eine der Abhängigkeiten nicht finden.

    -> http://www.dependencywalker.com/



  • hmm.. das ist ein Ansatz.. ! Ja die Dll ist mit einer anderen verknüpft. d.h. wenn die andere Dll nich vorhanden "wäre", könnte ich diese Dll nich laden? hätte gedacht, das erst durch benutzung von funktionen der dll fehler auftreten.. danke



  • BorisDieKlinge schrieb:

    hmm.. das ist ein Ansatz.. ! Ja die Dll ist mit einer anderen verknüpft. d.h. wenn die andere Dll nich vorhanden "wäre", könnte ich diese Dll nich laden? hätte gedacht, das erst durch benutzung von funktionen der dll fehler auftreten.. danke

    Nur, wenn die zweite Dll dynamisch geladen wird. Bei einer (normalen) statischen Bindung lädt der Kernel diese sofort mit der ersten Dll. Und wenn es nicht geht, dann wird die erste auch nicht geladen.



  • hmm die verschachtelte Dll welche in meiner Dll verwendet wird, wird dynamisch geladen... Aber das war das Problem... danke



  • Mit "dynamisch" meine ich während der Ausführung einer beliebigen Funktion. Heißt diese Funktion aber DllMain, dann gibts natürlich den Fehler.


  • Mod

    BorisDieKlinge schrieb:

    hmm die verschachtelte Dll welche in meiner Dll verwendet wird, wird dynamisch geladen... Aber das war das Problem... danke

    ⚠ Du weißt hoffentlich, dass es nicht erlaubt ist LoadLibrary aus DLLMain heraus auszuführen ⚠

    It is not safe to call LoadLibrary from DllMain.

    Siehe http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx



  • mach ich das, siehe code?



  • BorisDieKlinge schrieb:

    mach ich das, siehe code?

    Dir traue ich alles zu.


  • Mod

    BorisDieKlinge schrieb:

    mach ich das, siehe code?

    1. 100% ACK zum Kommentar von simon.gysi
    2. Wie soll ich diesen Satz anders verstehen:

    hmm die verschachtelte Dll welche in meiner Dll verwendet wird, wird dynamisch geladen... Aber das war das Problem... danke

    3. Sehe ich keinen Code Deiner DLL! Sondern nur den einer EXE!
    Solltest Du also LoadLibrary in Deiner DLL Main ausführen, dann sei gewarnt! Es knallt an den übelsten nicht zu erartenden Ecken.



  • sorry, wir dachten aneinander vorbei;)

    1. Die LoadLibrary meiner exe ruf ich ja in main auf;)
    2. Diese Dll wiederum, also LoadLibrary ruft ne andere Dll in "iniInstance" auf;)
    3. Hab die LoadLibrary nich geschrieben....

    EDIT: (verschrieben)

    1. Die LoadLibrary meiner exe ruf ich ja in main auf;)
    2. Diese Dll wiederum, also RenaLibrary ruft ne andere Dll in "iniInstance" auf;)
    3. Hab die RenaLibrary nich geschrieben....


  • Mod

    Und wie ist diese andere DLL an Deine DLL gebunden? Dynamisch oder implizit?



  • dynamisch..? Loadlibrary..


  • Mod

    OK also dynamisch! Und wann führst Du LoadLibary in Deiner anderen DLL aus?

    Also nur m sicher zu gehen.
    - EXE lädt implizit oder dynmaisch eine DLL A
    - DLL A lädt dann dynamisch DLL B

    Wann macht DLL A?



  • DLL A stellt eine Schnittstelle (eine read/write funktionen) zwischen einem externe Device her.. diese funktionen liest bzw. schreibt die rohdaten vom gerät.

    DLL B stellt eine spezialisrte Schnittstelle (read/write funktionen für best. Typen) zwischen einem exteren Device (über DLL A) her... diese funktionen schreiben/lesen Daten best. Typen (doub,int,string,etc) an das Gerät.

    die EXE verwendent dann die spezialisierten funktionen. ich könnte auch direkt DLL A einbinden, müsste aber die Datenkonvertierung welche, von DDL B übernommen wird auch schreiben:)

    DLL B ist kruz gesagt eine art wrapper:)


  • Mod

    Martin Richter schrieb:

    OK also dynamisch! Und wann führst Du LoadLibary in Deiner anderen DLL aus?



  • BorisDieKlinge schrieb:

    Diese Dll wiederum, also RenaLibrary ruft ne andere Dll in "iniInstance" auf;)



  • BorisDieKlinge schrieb:

    BorisDieKlinge schrieb:

    Diese Dll wiederum, also RenaLibrary ruft ne andere Dll in "iniInstance" auf;)

    von wo aus wird iniInstance aufgerufen?
    Nicht etwa aus Dll- Main?


Log in to reply