PDA

View Full Version : [C/C++] Dubbi su DLL_PROCESS_ATTACH in una dll


Ntropy
17-05-2010, 12:14
Salve a tutti,

Ho scritto una dll con alcune funzioni e fino a qui tutto ok, adesso avrei necessità che la dll venga caricata da un programma per la prima volta, compia alcune operazioni di inizializzazione e poi la funzione della dll viene chiamata una o più volte a secondo della necessità dal programma chiamanete e successivamente il programma termina e la dll viene scaricata.

Vorrei inserire le operazioni di inizializzazione qui:


BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
/*codice di inizializzazione*/
break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

return TRUE;
}

ma quando carico la dll con HINSTANCE hinstDLL = LoadLibrary("nome.dll");

non viene eseguito il codice di inizializzazione. Non dovrebbe essere eseguito direttamente ogni volta che carico la dll per la prima volta o devo chiamarlo io in qualche maniera?

grazie 1000 per l'aiuto

fero86
17-05-2010, 21:15
no, non devi invocarlo in alcun modo, la DllMain viene invocata automaticamente dal sistema. sei sicuro che la DLL venga caricata? LoadLibrary cosa restituisce? casomai per essere sicuro prova a mettere una DebugBreak all'inizio della DllMain, fuori dallo switch.

Ntropy
17-05-2010, 21:22
no, non devi invocarlo in alcun modo, la DllMain viene invocata automaticamente dal sistema. sei sicuro che la DLL venga caricata? LoadLibrary cosa restituisce? casomai per essere sicuro prova a mettere una DebugBreak all'inizio della DllMain, fuori dallo switch.

Credo di aver risolto. Aggiungendo la keyword extern al DllMain tutto funziona correttamente.

extern BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
/*codice di inizializzazione*/
break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

return TRUE;
}

adesso il codice inserito nello switch funziona a seconda dei casi.

grazie cmq per l'aiuto