我继承了一个遗留的经典ASP应用程序,它使用VB6 ActiveX DLL来执行业务逻辑。
我想跟踪加载和卸载DLL的点。有没有办法在VB6 DLL中拦截这些事件?
在相关的说明中,Class_Terminate事件是否总是在其包含的DLL卸载时运行?
答案 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)。