▶ 문제 코드
[환경]
OS : Windows 98
Language : Visual Basic 6.0 SP6
참고 : Paul Caton의 Self-SubClassing 기법(http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=54117&lngWId=1)

[소스 코드]
// 상세 생략 //
VB폼의 hWnd를 넘겨서 Subclass_Start()을 호출하여 서브클래싱을 시작하고
Subclass_AddMsg()로 몇 가지 메시지를 추가한 후 Subclass_Stop()을 호출.

▶ 문제점
- Windows 2000, XP 등 에서는 전혀 문제가 없지만 같은 코드를 Windows 98에서 실행할 경우 APP가 완전히 종료된 후 Memory Access Violation이 발생함
- APP 자체의 동작이나 서브 클래싱은 모두 정상적으로 작동하나 APP가 종료되는 시점에서 치명적으로 보기 좋지 않은 메시지를 보여주므로 문제.
- VB폼의 hwnd가 아닌 CreateWindow()등의 API로 생성한 윈도에서는 문제가 발생하지 않는 것으로 보임(정확하진 않음)

▶ 해결 과정
시도1 : 복잡한 서브 클래싱 과정을 최소로 줄여 SubClass_Start(), Stop()만 호출하여 테스트
여전히 같은 증상 발생.

시도2 : 라인 단위의 길고 지루한 트레이스를 통해 정상적으로 실행되지 않은 코드가 있는지 하나하나 체크... 별 다른 이상은 없음.

시도3 : 내부적으로 사용되는 GlobalAlloc(), VirtualProtect(), GlobalFree() 등의 동작 체크, 이상 없음.

시도4 : Paul Caton의 새 업데이트 없는지 확인. 없음.

시도5 : Self-SubClass 자체의 문제가 있다고 판단하고 다른 코드로 교체.
- 대체할 코드로 역시 Paul Caton이 작성한 WinSubHook.tlb 모듈을 사용.
- WinSubHook.tlb는 Self-SubClass에 비해 디자인 타임 의존성이 추가된다는 단점이 있지만 소스 코드는 훨씬 단순화 되므로 TLB 관리만 잘 한다면 큰 문제가 없을 것으로 생각됨.
- 같은 동작을 하는 코드를 WinSubHook TLB의 iSubClass 인터페이스를 통하여 구현, 2000, 98 모두 잘 동작하고 Access Violation도 발생하지 않음.

▶ 정리
- Paul Caton의 Self-SubClass 기법은 98에서 약간의 문제가 있는 것으로 판단됨.
- vbAccelerator.com에 올라온 Paul Caton의 WinSubHook TypeLibrary로 교체하여 해결함.
링크 : TLB 다운로드(http://www.vbaccelerator.com/home/VB/Type_Libraries/WinSubHook/article.asp)
WinSubHook 예제 및 설명(http://www.vbaccelerator.com/home/VB/Code/Libraries/Subclassing_and_Hooking_with_Machine_Code_Thunks/article.asp)
신고
Posted by gongdo


티스토리 툴바