기본 콘텐츠로 건너뛰기

윈도우에서 오라클19c 설치 중 ins-35180 오류 발생 시 조치 방법

Active X에서 SetTimer를 해도 안 되거나 PostMessage가 처리되지 않는 경우..

MFC로 만든 Active X 프로그램을 유지보수하는데, 주기적으로 실행할 작업이 있어서 SetTimer를 이용했습니다.

그런데... 웹화면에서 메뉴를 이동하고 나면 어째서인지 SetTimer로 지정한 작업이 실행되지 않았습니다.

원인을 찾지 못해서 결국 스레드로 처리하게 만들었습니다.
그리고 스레드에서 UI에 접근할 일이 있어서 PostMessage를 이용했습니다.

그런데.. 이상하게도 PostMessage로 메시지는 보내는데, 이것도 처리되지 않았습니다..
(메시지는 보내지는 것 같은데 실행이 안 되는 것 같았습니다.)


[원인분석]

Active X 프로그램의 생명주기를 아직도 잘 몰라서 자세한 것은 알 수 없었지만,

다음과 같이 처리되더군요.

(프로그램 이름이 Test이라고 했을 때..)

1. 웹브라우저에서 "Test" Active X를 로딩함
2. TestApp 객체 생성 (TestApp은 COleControlModule을 상속 받음)
3. TestApp의 InitInstance 메소드가 호출됨
4. TestCtrl 객체 생성 (TestCtrl은 COleControl을 상속 받음)
5. TestCtrl의 OnCreate 메소드 호출
6. TestCtrl의 OnEventAdvise 메소드 호출 (파라미터 TRUE)
7. 사용자가 메뉴 클릭
8. TestCtrl의 OnEventAdvise 메소드 호출 (파라미터 FALSE)
9. TestCtrl의 OnDestroy 메소드 호출
10. TestCtrl 객체 파괴
11. 페이지 이동 완료
12. TestCtrl 객체 생성
13. TestCtrl의 OnEventAdvise 메소드 호출 (파라미터 TRUE) 
14. 사용자가 웹브라우저 닫음
15. TestCtrl의 OnEventAdvise 메소드 호출 (파라미터 FALSE)
16. TestCtrl의 OnDestroy 메소드 호출
17. TestCtrl 객체 파괴
18. TestApp의 ExitInstance 메소드 호출
19. TestApp 객체 파괴


위 순서를 보시면 이상하게도 TestCtrl이 최초 한번만 OnCreate가 호출되고,
메뉴를 이동하고 나서는 호출되지 않았습니다.

그러니까 TestCtrl 객체는 존재하지만 실제로 Create되지는 않아서 윈도 메시지 펌프가 동작하지 않게 되었고, 그래서 Timer도, PostMessage도 동작하지 않았던 것입니다.


[해결방법?]

최초에 컨트롤이 생성되는 이유는 OLEMISC_ACTIVATEWHENVISIBLE 옵션[1]을 주었기 때문입니다.
그런데 왜 메뉴를 이동하고 나면 Create가 안 되는지는 결국 알아내지 못했습니다.
어쩌면 해당 Active X 프로그램은 화면에 보이지 않는 컨트롤이기 때문에 그럴지도 모르겠습니다.

해결방법을 찾지 못해서 고민하다가 우회적인 방법을 썼습니다.
OnEventAdvise 메소드가 호출될 때(파라미터 True) 사용자에게 보이지 않는 다이얼로그창을 하나 생성(Create)한 후, 그 다이얼로그창에서 SetTimer를 실행하도록 했습니다...
 

[1] DEVPIA - "ActiveX(OCX) 프로그램에서 OnCreate가 마우스클릭하면 실행됨"

댓글

이 블로그의 인기 게시물

프로세스 강제 종료 불가 시.

특정 프로세스를 강제 종료 하려는데... "실행 중인 작업 인스턴스가 없습니다." 이런 메시지가 나타나면서 종료가 안되는 문제가 있었습니다. 작업 관리자에서 "프로세스 종료", "프로세스 트리 종료" 해봐도 안되고, cmd에서 taskkill 해봐도 안되고... 그런데 이게 부모 프로세스를 종료하면 자동으로 종료가 되네요.. (제 경우에는 Visual Studio가 부모 프로세스였습니다. ㅋ) 참고: DEVPIA http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=917792&ref=917791