Dynamisches Laden einer dll mit Parameter (CString)



  • Hi,

    ich habe mir schon einiges zusammengesucht und auch getestet,
    ich komme allerdings nicht zum Ziel.

    Ich möchte eine DLL dynamisch laden. Das klappt auch, solange ich
    nicht vor der Herausforderung stehe einen CString oder sonstwas
    mit übergeben zu müssen.

    FARPROC pFunc;
    CString strTemp = "abc"; 
    
    HMODULE hDll = LoadLibrary("testlauf.dll"); 
    if(!hDll) 
      return; 
    
    pFunc = GetProcAddress(hDll, "MYFUNC"); // Funktionsname angeben
    if(pFunc) 
    (&pFunc)(strTemp);  //Parameter mit übergeben 
    //<----Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
    
    FreeLibrary(hDll);
    

    Ich muss wohl auch irgendwo sagen, dass meine Funktion überhaupt einen Parameter
    erwartet. Ich habe keinen Schimmer wie das funktioniert 😕



  • Der Typ für den Funktionspointer muss entsprechend definiert werden:

    //hoffe das stimmt so, kann grad nicht nachsehen
    typedef int (_cdecl *MYFUNC)(CString sTest);
    MYFUNC pFunc;
    

  • Mod

    Du musst den FARPROC Zeiger auf einen entsprechende Funktionszeiger mit der Signatur casten.

    Hier z.B. ein Code Snippet dass, etwas ähnliches mit einem Zeigr auf eine Datenstruktur macht:

    typedef HRESULT (CALLBACK* DLLGETVERSIONPROC)(DLLVERSIONINFO *);
    
    bool MyDllGetVersion(LPCTSTR szModulename, DLLVERSIONINFO& dvi)
    {
    	HINSTANCE hinst = ::LoadLibrary(szModulename);
    	if (!hinst)
    		return false;
    
    	// Must use GetProcAddress because the DLL might not implement 
    	// DllGetVersion. Depending upon the DLL, the lack of implementation of the 
    	// function may be a version marker in itself.
    	DLLGETVERSIONPROC pDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(hinst, "DllGetVersion");
    	if (!pDllGetVersion)
    	{
    		// Entladen
    		::FreeLibrary(hinst);
    		return false;
    	}
    
    	// Clear result struct
    	memset(&dvi, 0, sizeof(dvi));			 // clear
    	dvi.cbSize = sizeof(dvi);				 // set size for Windows
    	bool bReturn = SUCCEEDED((*pDllGetVersion)(&dvi));
    
    	// Free again
    	::FreeLibrary(hinst);
    	return bReturn;
    }
    

    Warnung: Das Austauschen von CString's zwischen EXE und DLL funktioniertnur Zuverlassig, wenn 1. MFC nicht statisch gelinkt wird und 2. auch die gleiche CRT verwendet wird und 3. auch der gleiche Compiler (SP) verwendet wird.


  • Mod

    EDIT: Doppelpost gelöscht....



  • Danke euch beiden, das hat mir sehr geholfen.

    Mir war nicht klar, dass man so den typedef benutzen muss.
    Damit hat es wunderbar kompiliert und jetzt ist es auch logischer
    für mich nachzuvollziehen 🙂


Anmelden zum Antworten