如何拦截VB6 ActiveX DLL中的DLL加载/卸载事件?

时间:2009-11-18 08:30:00

标签: dll vb6 asp-classic activex

我继承了一个遗留的经典ASP应用程序,它使用VB6 ActiveX DLL来执行业务逻辑。

我想跟踪加载和卸载DLL的点。有没有办法在VB6 DLL中拦截这些事件?

在相关的说明中,Class_Terminate事件是否总是在其包含的DLL卸载时运行?

3 个答案:

答案 0 :(得分: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的消息和用于运行Test的另一个消息。然后当我点击Command2。

这个例子相当粗糙,所以我希望你明白这一点。

<强>摘要 在您拥有的每个ActiveX中创建一个TDLLManagement类。将Initialize Code放在Class_Initialize中,将Terminate代码放在Class_Terminate中。然后让Sub Main创建该类的实例并分配给私有模块变量。请注意,如果您有任何GlobalMultisuse类并直接引用要执行简单测试的ActiveX DLL,以查看DLL加载的位置。

答案 1 :(得分:1)

如果VB dll被卸载,ASP中会发生不好的事情,它只是不能很好地处理这个概念。该DLL应该使用“Retain in Memory”标志(以及“无人值守执行”)进行编译。

您可以使用Sub Main来检测加载。

答案 2 :(得分:0)

经典的VB6加载项vbAdvance允许您向DLLMain添加代码,因此可以获得DLL的启动和拆卸通知。 编辑:很遗憾,如果您使用此DLL,您的DLL必须是标准DLL,它不能是COM(ActiveX)DLL。一句警告 - don't do anything too scary in DLLMain

据我所知,Class_Terminate应始终在包含DLL卸载之前运行,除非应用程序异常终止(例如使用End)。