2009-11-18 4 views
2

Я унаследовал традиционное классическое приложение ASP, которое использует VB6 ActiveX DLL для выполнения бизнес-логики.Как перехватить события загрузки/выгрузки DLL в DLL VB6 ActiveX?

Я хотел бы отслеживать точки, в которых DLL загружаются и выгружаются. Есть ли способ перехватить эти события в VB6 DLL?

Относительно примечания, должны ли события Class_Terminate всегда запускаться, когда их содержащие DLL-файлы выгружаются?

+0

У вас есть исходный код для этих VB6 ActiveX DLL? –

+0

Да, у меня есть исходный код для них. – dommer

+0

Каков мотив для обнаружения этого? Обновление? – AnthonyWJones

ответ

2

Используйте Sub Main как ваш начальный объект.

Создайте модуль, как этот

Option Explicit 

Private TerminateDetect As Terminate 

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

Тогда ваш прекратить класс выглядит следующим образом

Option Explicit 

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

тест класс я сделал это

Option Explicit 

Public Description As String 

Public Sub Test() 
    MsgBox "test" 
End Sub 

Я сделал форму с не такие ссылки

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 

Когда я нажимаю на Command1, я получаю два сообщения для загрузки DLL, а другое для запуска теста. Затем, когда я нажимаю Command2.

Этот пример довольно грубый, поэтому я надеюсь, что вы поняли суть.

Резюме Внесите класс TDLLManagement в каждый ActiveX, который у вас есть. Поместите свой код инициализации в Class_Initialize и ваш код завершения в Class_Terminate. Затем необходимо, чтобы Sub Main создала экземпляр этого класса и назначила частную переменную модуля. Обратите внимание, что если у вас есть классы GlobalMultisuse и напрямую ссылайтесь на ActiveX DLL, вы хотите сделать простые тесты, чтобы увидеть, где загружается DLL.

0

Классическая надстройка VB6 vbAdvance позволяет добавлять код в DLLMain и, следовательно, получать уведомления о запуске и разрыве для ваших DLL. EDIT: К сожалению, если вы используете это, ваша DLL должна быть стандартной DLL, это не может быть DLL COM (ActiveX). Слово предупреждения - don't do anything too scary in DLLMain.

Насколько я знаю, Class_Terminate должен всегда запускаться до выгрузки DLL, за исключением случаев аномального завершения приложения (например, с помощью End).

+0

Я пытался заставить это работать, но кажется, что если я хочу добавить код в DLLMain, то моя DLL больше не будет DLL ActiveX, то есть станет простой. Это так, или я пропустил какую-то важную вещь? – dommer

+0

@ dommer, я думаю, вы можете быть правы. Извини за это. Вместо этого попробуйте ответить RS Conley. – MarkJ

1

Плохие вещи случаются в ASP, если VB dll выгружается, он просто не очень хорошо справляется с этой концепцией. Dll следует скомпилировать с флагом «Сохранить в памяти» (а также «Автоматическое выполнение»).

Вы можете использовать Sub Main для определения загрузки.

Смежные вопросы