Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema nel caricamento di DLL
Forum - C/C++ - Problema nel caricamento di DLL

Avatar
giulioscatto (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/08/2009

Segnala al moderatore
Postato alle 20:05
Mercoledì, 03/08/2011
Buonasera,
ho scritto una piccola libreria DLL che non si comporta come mi aspetto.

Questo è il main (che immagino venga eseguito ogni volta che si carichi in memoria la libreria da programma esterno)
Codice sorgente - presumibilmente C++

  1. HINSTANCE _hInstance = NULL;
  2.  
  3. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  4. {
  5.     switch (fdwReason)
  6.     {
  7.         case DLL_PROCESS_ATTACH:
  8.             _hInstance = hinstDLL;
  9.  
  10.             if (_hInstance == NULL) return NULL;
  11.                         break;
  12.      ....



Ho scritto un altro programma che me la carica con LoadLibrary ma, dopo qualche indagine (che parolona), ho scoperto che _hInstance è ancora NULL.
Tutto questo mi fa pensare che DllMain non venga eseguita, oppure che il parametro hinstDLL sia veramente NULL al momento della 'caricata'.
Altro motivo potrebbe essere che fdwReason non sia uguale a DLL_PROCESS_ATTACH ma questo significherebbe che la libreria sia già in memoria (da MSDN: "If the specified module is a DLL that is not already loaded for the calling process, the system calls the DLL's DllMain function with the DLL_PROCESS_ATTACH value") potrebbe essere il mio caso?

Vi ringrazio per le delucidazioni.
Giulio



Ultima modifica effettuata da giulioscatto il 03/08/2011 alle 20:08
PM
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Up
1
Down
V
Segnala al moderatore
Postato alle 20:12
Mercoledì, 03/08/2011

PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6381
Iscritto: 03/01/2010

Up
-1
Down
V
Segnala al moderatore
Postato alle 21:56
Mercoledì, 03/08/2011
Sposta questa linea

_hInstance = hinstDLL;

poco prima dello switch per provare ...



Avevo già provato con un tipo int dichiarato a livello globale e non veniva modificato.. - giulioscatto - 03/08/11 22:14
E infatti le cose non cambiano facendo come dici tu - giulioscatto - 03/08/11 22:15
Con quale strumento hai creato la DLL e il programma di test? Posso provare tutto il progetto scaricandolo in uno zip? - nessuno - 03/08/11 22:18
CodeBlocks con GCC. Ora metto su lo zip. - giulioscatto - 03/08/11 22:20
HO RISOLTO: nell'header della DLL non avevo inserito il prototipo della DllMain (+ __declspec(dllexport)) - giulioscatto - 03/08/11 23:14
Ok ... cancello tutto quello che avevo scaricato - nessuno - 03/08/11 23:47
Grazie mille comunque! - giulioscatto - 03/08/11 23:54


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM