2009-11-18 2 views
2

비즈니스 로직을 수행하기 위해 VB6 ActiveX DLL을 사용하는 기존 클래식 ASP 응용 프로그램을 상속 받았습니다.VB6 ActiveX DLL에서 DLL로드/언로드 이벤트를 가로채는 방법은 무엇입니까?

DLL로드 및 언로드 지점을 추적하고 싶습니다. VB6 DLL에서 이러한 이벤트를 가로 챌 수있는 방법이 있습니까?

관련 메모에서 Class_Terminate 이벤트는 포함 된 DLL이 언로드 될 때 항상 실행해야합니까?

+0

VB6 ActiveX DLL에 대한 소스 코드가 있습니까? –

+0

예, 소스 코드가 있습니다. – dommer

+0

이것을 탐지하는 동기는 무엇입니까? 업그레이드 중입니까? – AnthonyWJones

답변

2

시작 개체로 Sub Main을 사용하십시오.

는 그런 다음이 클래스는 내가 만든 테스트 클래스는이

Option Explicit 

Public Description As String 

Public Sub Test() 
    MsgBox "test" 
End Sub 

내가 더와 양식을하지 않습니다

Option Explicit 

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

처럼 보이는이

Option Explicit 

Private TerminateDetect As Terminate 

Public Sub Main() 
    Set TerminateDetect = New Terminate 
    MsgBox "Setup" 
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 Class를 만듭니다. 초기화 코드를 Class_Initialize에두고 종료 코드를 Class_Terminate에 넣으십시오. 그런 다음 Sub Main에서 해당 클래스의 인스턴스를 만들고 개인 모듈 변수에 할당합니다. GlobalMultisuse 클래스가 있고 ActiveX DLL을 직접 참조하면 간단한 테스트를 통해 DLL이로드되는 위치를 확인하십시오.

0

기존 VB6 추가 기능 vbAdvance을 사용하면 DLLMain에 코드를 추가 할 수 있으므로 DLL에 대한 시작 알림 및 teardown 알림이 제공됩니다. EDIT :이 DLL을 사용하면 표준 DLL이어야하며 COM (ActiveX) DLL이 될 수 없습니다. 경고의 말씀 - don't do anything too scary in DLLMain.

내가 아는 한 Class_Terminate는 응용 프로그램의 비정상적인 종료 (예 : End 사용)를 제외하고는 포함 DLL이 언로드되기 전에 항상 실행되어야합니다.

+0

나는 이것을 작동 시키려고 노력해 왔지만 DLLMain에 코드를 추가하고 싶다면 내 DLL이 더 이상 ActiveX DLL이 될 수 없다 - 즉, 일반 DLL이 될 것 같습니다. 이 경우인가, 아니면 중요한 부분을 놓치고 있습니까? – dommer

+0

@dommer, 나는 네가 옳을 수도 있다고 생각한다. 미안합니다. 대신 RS Conley의 대답을 시도하십시오. – MarkJ

1

VB에서 dll이 언로드 된 경우 ASP에서이 작업이 제대로 처리되지 않으면 문제가 발생합니다. dll은 "메모리에 보유"플래그 ("무인 실행")와 함께 컴파일해야합니다.

Sub Main을 사용하여로드를 감지 할 수 있습니다.

관련 문제