Как перехватить события DLL загрузки / выгрузки в VB6 ActiveX DLL? - PullRequest
2 голосов
/ 18 ноября 2009

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

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

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

Ответы [ 3 ]

2 голосов
/ 18 ноября 2009

Используйте 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, а другое для запуска Test. Затем, когда я нажимаю на Command2.

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

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

1 голос
/ 19 ноября 2009

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

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

0 голосов
/ 18 ноября 2009

Классическая надстройка VB6 vbAdvance позволяет добавлять код в DLLMain и, следовательно, получать уведомления о запуске и завершении работы ваших DLL. РЕДАКТИРОВАТЬ: к сожалению, если вы используете это, ваша DLL должна быть стандартной DLL, она не может быть COM (ActiveX) DLL. Предупреждение: не делайте ничего страшного в DLLMain .

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

...