2012-04-30 8 views
9

Sto avendo un sacco di problemi nel gestire una DLL che ho scritto in Delphi. Ho installato una funzione DllMain utilizzando il seguente codice nella libreria:Delphi DllMain DLL_PROCESS_DETACH chiamato prima DLL_PROCESS_ATTACH

begin 
    DllProc := DllMain; 
end. 

mia procedura DllMain si presenta così:

procedure DllMain(reason: Integer); 
begin 
    if reason = DLL_PROCESS_DETACH then 
    OutputDebugString('DLL PROCESS DETACH') 
    else if reason = DLL_PROCESS_ATTACH then 
    OutputDebugString('DLL PROCESS ATTACH') 
    else if reason = DLL_THREAD_ATTACH then 
    OutputDebugString('DLL THREAD ATTACH') 
    else if reason = DLL_THREAD_DETACH then 
    OutputDebugString('DLL THREAD DETACH') 
    else 
    OutputDebugString('DllMain'); 
end; 

Quello che sto trovando è che si staccano sembra di essere chiamato (due volte ?!) da un chiamante (che non controllo) prima che sia mai stato chiamato ATTACH. E 'anche possibile, o sto fraintendendo come dovrebbe funzionare? La mia aspettativa sarebbe che ogni chiamata ATTACH sarebbe soddisfatta con una chiamata DETACH corrispondente, ma non sembra essere il caso.

Cosa sta succedendo qui ?!

risposta

12

Sfortunatamente quando begin viene eseguito nel codice dll, il sistema operativo ha già chiamato DllMain nella libreria. Pertanto, quando viene eseguita l'istruzione DllProc := DllMain;, è già troppo tardi. Il compilatore Delphi non consente l'esecuzione del codice utente quando la DLL è collegata a un processo. La soluzione suggerita (se si può chiamare che una soluzione) è quello di chiamare la propria funzione DllMain se stessi in una sezione unitaria inizializzazione del o nel codice della libreria:

begin 
    DllProc := DllMain; 
    DllMain(DLL_PROCESS_ATTACH); 
end; 

Il relevant documentation:

Nota : DLL_PROCESS_ATTACH viene passato alla procedura solo se il codice di inizializzazione della DLL chiama la procedura e specifica DLL_PROCESS_ATTACH come parametro.

+0

Hmm ... Speravo che questa sarebbe stata la soluzione a tutti i miei problemi, ma questa conoscenza aggiuntiva (anche se vera e rispondendo alla mia domanda) non ha ancora risolto i miei problemi. Sembra che dovrò creare un'altra domanda :). Grazie per l'aiuto! – aardvarkk

+0

Cosa non capisci. È tutto qui giusto in questa domanda. L'unica chiamata di DllMain che si verifica prima dell'esecuzione del codice è per 'DLL_PROCESS_ATTACH'. Quindi lo scrivi come dice Sertac e va tutto bene. –

+0

No, questo è completamente chiaro. Capisco e potrei implementarlo. Ha rivelato, tuttavia, che la risposta al mio problema più grande (che speravo fosse collegato a questo), non è in realtà collegata a questo problema. Quindi la ricerca continua! – aardvarkk

-1

Quello che sto trovando è che si staccano sembra di essere chiamato (due volte ?!) di un chiamante (che io non controllo) prima ATTACH viene mai chiamato.

Secondo "Programming Windows 5th edition" di Petzold.
DLL_PROCESS_ATTACH viene chiamato all'avvio dell'applicazione e
DLL_THREAD_ATTACH quando viene avviato un nuovo thread all'interno di un'applicazione allegata.
DLL_PROCESS_DETACH viene chiamato quando si chiude un'applicazione connessa all'applicazione.
DLL_THREAD_DETACH viene chiamato quando si chiude un thread all'interno di un'applicazione allegata.

Si noti che è possibile chiamare DLL_THREAD_DETACH senza un precedente DLL_THREAD_ATTACH precedente.
Ciò si è verificato all'avvio del thread precedente all'applicazione che si collega alla DLL.
Ciò si verifica principalmente quando un'applicazione carica manualmente la DLL utilizzando LoadLibrary anziché il collegamento statico in fase di compilazione.

+0

Non capisco. Intendi una discussione senza processo? E 'LoadLibrary' non porterà a un 'DLL_PROCESS_ATTACH'? –

+0

Questo non sembra spiegare perché 'DLL_PROCESS_DETACH' sta accadendo più volte. –

Problemi correlati