Caricare dinamicamente dll

di il
22 risposte

Caricare dinamicamente dll

Ciao! Dovrei caricare in modo dinamico una dll ma non capisco come fare. io faccio
hinstDLL = LoadLibrary(TEXT("my.dll")); 
e va bene.
Nella dll ho una funzione
int getNumber()
.
Se nella mia applicazione provo ad usare la funzione, il compilatore mi da errore..

22 Risposte

  • Re: Caricare dinamicamente dll

    Devi indagare di più.
    Usa GetProcAddress per trovare la tua funzione dentro la dll.

  • Re: Caricare dinamicamente dll

    Ok grazie. Pero' nell'esempio, all'inizio del programma fa:
    typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
    
    io non capisco cosa devo indicare per la mia funzione la quale è definita nella dll in questo modo:
    LIBRERIA long getNumber();
  • Re: Caricare dinamicamente dll

    
    typedef long (CALLBACK* LPFNDLLFUNC1)(void);
    
    oppure
    
    typedef long (CALLBACK* getNumberPtr)(void);
    
  • Re: Caricare dinamicamente dll

    Grazie Io ho anche un hook globale per gli eventi mouse nella mia dll:
    LIBRERIA LRESULT CALLBACK MouseProc( __in  int nCode, __in  WPARAM wParam, __in  LPARAM lParam);
    se faccio come in questo esmpio:
    ovvero.
    
    HOOKPROC hkprcSysMsg;
    if((hkprcSysMsg=(HOOKPROC)GetProcAddress(hinstDLL, "MouseProc"))==NULL){
            DWORD s=GetLastError();
    	return 0; //fallita installazione dell'hook
    }
    la variabile hkprcSysMsg vale NULL
  • Re: Caricare dinamicamente dll

    Con che errore?
  • Re: Caricare dinamicamente dll

    Error 127: The specified procedure could not be found
  • Re: Caricare dinamicamente dll

    Esiste l'export che sta procedura? controlla con CFFExplorer o altri programmi.
  • Re: Caricare dinamicamente dll

    Un altra cosa. Se la libreria è tua e hai i listati perche non caricarla in modo statico e togliersi la grana del getprocaddress. Basta un .h e .lib e sei aposto.
  • Re: Caricare dinamicamente dll

    Ci ho pensato di caricarla in modo statico. pero' cosa passo alla funzione
    SetWindowsHookEx(WH_MOUSE,hkprcSysMsg,hinstDLL,0)
    al posto di hkprcSysMsg?
  • Re: Caricare dinamicamente dll

    Direi (HOOKPROC)MouseProc e basta. Ma sto Mouseproc è esportato poi? Il nome esportato è giusto oppure ha delle aggiunte (il famoso name mangling del MS).
  • Re: Caricare dinamicamente dll

    Ho scaricato il programma ma non so come guardare se è esportato ma credo di si siccome la mia dll è cosi:
    #include "stdafx.h"
    #include <memory.h> 
    #define LIBRERIA extern "C" __declspec(dllexport)
    #include "Libreria.h"
    
    #pragma data_seg("Shared")
     long volatile *messaggi;
    #pragma data_seg( )
    
    #pragma comment(linker,"/section:Shared,rws")
    
    //hook globale per gli eventi di tipo mouse
    LRESULT CALLBACK MouseProc( __in  int nCode, __in  WPARAM wParam, __in  LPARAM lParam){
    
    	//deve incrementare il numero di messaggi presi dalle applicazioni
    	InterlockedDecrement(messaggi);
    	return CallNextHookEx(0,nCode,wParam,lParam);
    }
    
    
    long getNumber(){
    //da fare
    	return 1;
    }
  • Re: Caricare dinamicamente dll

    Allora con il programma apri la dll e vedi Export Directory. Dovresti trovare le funzioni esportate.
    Cmq ti riporto un esempio di MouseProc anche se è un po diverso dal tuo. Il mio mouseproc sta nel exe non nella dll.
    
    nel file .h della classe PM2Dlg
    static HHOOK mHook;
    static LRESULT CALLBACK LowLevelMouseProc(int nCode,WPARAM wParam,LPARAM lParam);
    
    nel file .cpp della classe PM2Dlg
    if(mHook == NULL)
    {
    	mHook = SetWindowsHookEx(WH_MOUSE_LL,&CPM2Dlg::LowLevelMouseProc,AfxGetInstanceHandle(),0);
    }
    
    LRESULT CALLBACK CPM2Dlg::LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if(nCode < 0)
    	{
    		return CallNextHookEx(mHook,nCode,wParam,lParam);
    	}
    	if(wParam == WM_LBUTTONDOWN)
    	{
    		MSLLHOOKSTRUCT *ptr = (MSLLHOOKSTRUCT *)lParam;
    		::PostMessage(AfxGetMainWnd()->m_hWnd,WM_VIDEO_CONTROL,FULLSCREEN,MAKELPARAM(ptr->pt.x,ptr->pt.y));
    	}
    	return CallNextHookEx(mHook,nCode,wParam,lParam);
    }
    
    ecc.
  • Re: Caricare dinamicamente dll

    Dopo che apro il file .dll, in export directory mi dice solo che ho 3 funzioni esportate ma non mi fa vedere quali
  • Re: Caricare dinamicamente dll

    Vedi la lista delle funzioni esportate in una mia dll.
    Allegati:
    7532_81ce68ef041a03edbbde5e05f08952b8.jpg
    7532_81ce68ef041a03edbbde5e05f08952b8.jpg
Devi accedere o registrarti per scrivere nel forum
22 risposte