2008-09-15 4 views
1

필자가 작성한 ActiveX 컨트롤에 난처한 문제가 발생합니다. 때때로 Internet Explorer가 프로세스 종료시 컨트롤을 제대로 언로드하지 못하는 것 같습니다. 이로 인해 컨트롤 인스턴스의 소멸자가 호출되지 않습니다.Internet Explorer가 ActiveX 컨트롤을 제대로 언로드하지 못하는 상황은 무엇입니까?

컨트롤은 C++로 작성되었으며 ATL을 사용하며 Visual Studio 2005를 사용하여 컴파일됩니다. 컨트롤 인스턴스가 포함 된 페이지에서 사용자가 이동할 때 항상 컨트롤 인스턴스의 소멸자가 호출됩니다. 브라우저에서만 문제가 발생합니다 닫은.

IE를 디버거에서 실행할 때 디버거가 예외, 액세스 위반 또는 어설 션 오류를 catch하지 않지만 문제가 여전히 남아 있습니다. 컨트롤의 중단 점을 설정할 수 있습니다. 소멸자이고 내가 broswer를 닫을 때 결코 치지 않습니다.

또한 컨트롤의 여러 인스턴스를 포함하는 간단한 HTML 페이지를로드 할 때 문제가 표시되지 않습니다. 문제는 웹 페이지에 태그를 동적으로 삽입하는 웹 애플리케이션에서 컨트롤을 인스턴스화 할 때만 발생합니다. 물론이 문제의 원인을 알지 못하더라도이 정보가 관련이 있는지 여부는 모르지만, 그러나 이것은 데이터에 의존하기 때문에 IE 문제 일 수 있음을 나타냅니다.

디버거에서 간단한 테스트 케이스를 실행하면 컨트롤의 소멸자에 중단 점을 설정할 수 있으며 매번 충돌이 발생합니다. 이것은 컨트롤 자체에 문제가 있다고 판단합니다. (예를 들어, 인터페이스 누설과 같이 소멸자가 호출되는 것을 막는 오류)

IE 6에서 테스트 한 대부분을 수행했지만 문제는 IE 7에서도 발생합니다. IE 8을 테스트하지 않았습니다.

실무적 가설은 동적 HTML 코드에 브라우저가 ActiveX 컨트롤의 인터페이스를 누설시키는 무언가가 있다는 것입니다. 지금까지 응용 프로그램 외부에서이를 재현하는 좋은 테스트 케이스를 생성 할 수 없었으며 응용 프로그램이 너무 커서 좋은 테스트 케이스를 만들 수 없습니다.

나는 이런 종류의 행동을 일으키는 것으로 알려진 가능한 IE 버그에 대해 누군가가 통찰력을 제공 할 수 있기를 바랍니다. 아래에 제공된 답변은 너무 일반적입니다.이 문제를 일으키는 것으로 알려진 특정 상황을 찾고 있습니다. 분명히 누군가가 전에 이것을 보았습니다.

답변

3

개체의 (C++) 소멸자가 호출되지 않는 COM에서 C++의 문제를 디버깅하려면 COM 개체의 refcount가 증가 또는 감소되는 방식에 중점을 두는 것이 가장 좋습니다. 아마 일어나는 일은 누군가가 refcount를 너무 많이 증가시키고, 같은 횟수만큼 감소시키지 않는다는 것입니다. 이로 인해 개체가 해제되지 않습니다.

동적 HTML은 정적 페이지를 사용하는 경우 발생하지 않는 IE에서 버그를 표시하는 것일 수 있습니다.

IE에 버그가있는 경우 트릭은 버그의 원인을 파악하고 IE를 속여 COM 개체를 적절히 릴리스하도록 (예 : HTML이 사라지는 것처럼) 할 수 있습니다.

+0

제안 해 주셔서 감사합니다. 동적 인 HTML 코드는 충분히 털이있어서 어떻게 작동하는지 아무도 확신 할 수 없으며, 문제를 재현하는 테스트 케이스를 작성하기에 충분할만큼 그것을 풀기위한 시도는 지금까지 실패했습니다. –

0

또 다른 방법 - DllMain 함수에 정리 코드를 추가합니다 (아직없는 경우 해당 함수 추가).그런 다음에 관계없이 참조 카운트 (참조 카운트 오류), 당신의 DLL이 언로드 될 때 자신을 정리할 수의 :

BOOL WINAPI DllMain(HINSTANCE, DWORD dwReason, LPVOID) { 
    if (dwReason == DLL_PROCESS_DETACH) { 
     CleanUpAnyObjectsStillAlive(); 
    } 
} 

아, 그리고 경고의 말씀 - 당신의 정리를하고 너무 오래 걸릴하지 않습니다 - 당신이 경우 어쨌든, 프로세스 종료가 당신을 죽이지 않을 것이라고 약속 할 수는 없어요.

+0

MFC로 작성된 컨트롤에서 그렇게 할 수 없다는 것을 알고 있습니까? –

+0

왜? MFC 전문가는 아니지만 MFC와 같은 라이브러리가 * 포함 시키려면 * 자신의 DllMain을 제공하지 못하도록 할 수는 없습니다. MFC 컨트롤이이를 정리하는 방법을 제공하지 않는다는 것을 의미합니까? 사건이 호소하는 경우. – Bruce

+0

또는 MFC가 자체적으로 DllMain을 구현했음을 의미하는 것입니다. 그것은 문제가 될 것입니다. – Bruce

0

동일한 문제가 있지만 특정 컴퓨터에서만 발생합니다. 또한이 컴퓨터에는 탭을 닫은 후에도 활성 상태 인 플래시 ActiveX에 문제가 있습니다. 내 생각 엔 코드에 문제가없는 것 같습니다. 다른 컴퓨터에서이 문제가 있습니까?

+0

다른 컴퓨터에서도 이걸 보았습니다. –