代码之家  ›  专栏  ›  技术社区  ›  dommer

如何截获vb6 ActiveX dll中的dll加载/卸载事件?

  •  2
  • dommer  · 技术社区  · 15 年前

    我继承了一个使用VB6 ActiveX DLL执行业务逻辑的传统经典ASP应用程序。

    我想跟踪加载和卸载DLL的点。在vb6 dll中是否有截获这些事件的方法?

    在相关的注释中,当包含类的dll卸载时,类“终止”事件是否应始终运行?

    3 回复  |  直到 13 年前
        1
  •  2
  •   RS Conley    15 年前

    使用Sub-Main作为启动对象。

    制作这样的模块

    Option Explicit
    
    Private TerminateDetect As Terminate
    
    Public Sub Main()
        Set TerminateDetect = New Terminate
        MsgBox "Setup"
    End Sub
    

    那么你的Terminate类看起来像这样

    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,另一条用于运行测试。然后当我点击命令2。

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

    总结 在每个ActiveX中创建一个TDllManagement类。将初始化代码放在类“初始化”中,将终止代码放在类“终止”中。然后让一个子主体创建该类的一个实例并分配给一个私有模块变量。注意,如果您有任何GlobalMultiSuse类,并且直接引用了ActiveX dll,那么您需要执行简单的测试来查看dll加载的位置。

        2
  •  1
  •   AnthonyWJones    15 年前

    如果一个vb dll被卸载,那么在ASP中会发生不好的事情,因为它不能很好地处理这个概念。编译DLL时应启用“保留在内存中”标志(以及“无人参与的执行”)。

    可以使用Sub-Main检测加载。

        3
  •  0
  •   MarkJ    15 年前

    经典的VB6加载项 vbAdvance 允许您向dllmain中添加代码,从而为您的dll获取启动和拆卸通知。 编辑: 不幸的是,如果您使用这个,您的dll必须是标准dll,它不能是COM(ActiveX)dll。一句警告的话- don't do anything too scary in DLLMain .

    据我所知,类“终止”应该总是在包含dll的卸载之前运行,除非应用程序异常终止(例如使用end)。