2009-11-18 4 views
2

J'ai hérité d'une application ASP classique héritée qui utilise les DLL ActiveX VB6 pour exécuter la logique métier.Comment intercepter des événements DLL de chargement/déchargement dans une DLL ActiveX VB6?

Je voudrais suivre les points auxquels les DLL sont chargées et déchargées. Est-il possible d'intercepter ces événements dans une DLL VB6? Sur une note connexe, les événements Class_Terminate doivent-ils toujours s'exécuter lorsqu'une DLL contenant leur contenu est déchargée?

+0

Avez-vous le code source de ces DLL ActiveX VB6? –

+0

Oui, j'ai le code source pour eux. – dommer

+0

Quel est le motif pour détecter cela? Mise à niveau? – AnthonyWJones

Répondre

2

Utilisez Sub Main comme objet de démarrage.

Faire un module comme celui-ci

Option Explicit 

Private TerminateDetect As Terminate 

Public Sub Main() 
    Set TerminateDetect = New Terminate 
    MsgBox "Setup" 
End Sub 

Ensuite, votre résilier classe ressemble à ceci

Option Explicit 

Private Sub Class_Terminate() 
    MsgBox "I terminated" 
End Sub 

Une classe de test que je fait est ce

Option Explicit 

Public Description As String 

Public Sub Test() 
    MsgBox "test" 
End Sub 

J'ai fait une forme sans des références comme ceci

Option Explicit 
Private O As Object 

Private Sub Command1_Click() 
    Set O = CreateObject("TestUnload.Dummy") 
    O.Test 
End Sub 

Private Sub Command2_Click() 
    Set O = Nothing 
End Sub 

Lorsque je clique sur Command1 j'obtiens deux message un pour charger la DLL et un autre pour exécuter Test. Puis quand je clique sur Command2.

Cet exemple est plutôt brutal alors j'espère que vous comprendrez le point.

Résumé Créez une classe TDLLManagement dans chaque ActiveX dont vous disposez. Placez votre code Initialize dans Class_Initialize et votre code Terminate dans Class_Terminate. Ensuite, demandez à Sub Main de créer une instance de cette classe et de l'affecter à une variable de module privée. Notez que si vous avez des classes GlobalMultisuse et référencez directement la DLL ActiveX, vous voulez effectuer des tests simples pour voir où la DLL se charge.

0

Le complément classique VB6 vbAdvance vous permet d'ajouter du code à DLLMain et, par conséquent, d'obtenir une notification de démarrage et de démontage de vos DLL. EDIT: Malheureusement, si vous utilisez ceci, votre DLL doit être une DLL standard, elle ne peut pas être une DLL COM (ActiveX). Un mot d'avertissement - don't do anything too scary in DLLMain. Pour autant que je sache, Class_Terminate doit toujours s'exécuter avant le déchargement d'une DLL contenant, sauf en cas de fin anormale de l'application (par exemple en utilisant End).

+0

J'ai essayé de faire fonctionner ceci, mais il semble que si je veux ajouter du code à DLLMain, ma DLL ne peut plus être une DLL ActiveX - c'est-à-dire qu'elle devient une simple. Est-ce le cas, ou est-ce que je manque un morceau essentiel? – dommer

+0

@dommer, je pense que vous pourriez avoir raison. Désolé pour ça. Essayez plutôt la réponse de RS Conley. – MarkJ

1

De mauvaises choses se produisent dans ASP si une DLL VB est déchargée, elle ne gère pas très bien ce concept. La DLL doit être compilée avec le drapeau "Retain in Memory" sur (ainsi que "Exécution sans surveillance").

Vous pouvez utiliser le sous-main pour détecter le chargement.

Questions connexes