2009-12-11 3 views
1

VS2008 및 ATL로 만든 C++로 작성된 ActiveX 컨트롤이 있습니다. 대부분의 경우, IDispatchImpl을 사용하는 대신 자체의 IDispatchEx 구현을 작성한다는 점을 제외하고는 꽤 표준 (원래 템플릿에서 많이 수정하지 않은 컨트롤)입니다. 이 컨트롤은 Internet Explorer에서만 사용되며 주로 IE8로 테스트했습니다.ATL 컨트롤의 InPlaceActivate가 마우스 이벤트가 발생할 때까지 호출되지 않습니다.

브라우저에서 객체 태그가 호스팅되는 지역 위로 마우스를 움직일 때까지는 아무 이유없이 InPlaceActivate가 호출되지 않습니다. 아무 창도 생성되지 않았습니다. WM_CREATE 메시지는 전송되지 않습니다.

DISPID_READYSTATE 구현을 시도했지만 아무것도 도움이되지 않습니다. SetClientSite 메서드에서 InPlaceActivate(OLEIVERB_UIACTIVATE);으로 전화를 걸면 일반적으로 작동하지만 확실히 정상적으로 수행 할 수는 없습니다.

왜 이런 일이 발생합니까? 브라우저는 InPlaceActivate를 호출 할 때 (또는 호출이 호출하는 시점)를 어떻게 결정합니까?

페이지에 ATL 컨트롤을 포함하는 데 사용되는 태그는 다음과 같습니다 <object id="plugin" type="application/x-vnd.FirebreathTemplatePlugin" width="300" height="300"></object>

당신은 파일에 대한 전체 소스는 여기에서 찾을 수 있습니다 : http://code.google.com/p/firebreath/source/browse/src/ActiveXPlugin/FBControl.h

답변

1

참조 할 수 있습니다. 실제로 OLEMSIC_ACTIVATEWHENVISIBLE은 .rgs 파일에서 % OLEMISC % 변수를 자동으로 생성하는 데 사용됩니다. 그러나, 나는 내 자신의 변수를 제공하기 위해 처리 기본 RGS를 무시했고, 그 과정에서 하나 개의 중요한 라인은을 추가 한 것이다 제거있어 : 레지스트리에

[CLSID]/MiscStatus/1 = s '131473'

. 이 aparently 초기화하는 방법을 결정하려면 브라우저에서 사용되며 해당 값을 OLEMISC_ACTIVATEWHENVISIBLE 'or'ed (|) 있습니다. 다시 입력하면 모든 것이 다시 작동합니다. 기본 ATL 클래스에서

1

당신이 당신의 IOleObject::GetMiscStatus() 구현 내부 OLEMISC_ACTIVATEWHENVISIBLE을 반환 시도?

+0

, 나는이 여전히 있습니다 DECLARE_OLEMISC_STATUS (OLEMISC_RECOMPOSEONRESIZE | OLEMISC_CANTLINKINSIDE | OLEMISC_INSIDEOUT | OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST ) 내가 실수로 그것을 대체 할 일을 할 수 있나요? – taxilian

+0

죄송합니다, 확실하지 않습니다. 그건 내 최고의 추측이었다. –

1

당신이 원하는 모든 당신의 창, 스크립트 생성 확인하는 경우, 당신은 PRB: ActiveX Control Window Is Not Created Until Visible in Internet Explorer

에 설명 된대로 창 이전에 생성 내가 범인을 발견 IE Automatic Component Activation (Changes to IE ActiveX Update)

+0

나는 그것을 보았다. 나는 그것이 아무것도 아닌 것보다 낫겠다고 생각하지만, 나는 다른 ATL 컨트롤을 만들었고 전에 이것을 할 필요가 없었다. 기본적으로 InPlaceActivate는 참조 된 문서에서 지정된대로 컨트롤이 표시 되 자마자 호출되어야합니다. 그것이 그려지는 영역 위로 마우스를 움직일 때까지 호출되지 않습니다. 이전에 읽은 적이있는이 기사에서는 기본적으로 창없는 컨트롤 인 것처럼 들립니다. 그러나 생성자의 첫 번째 줄은 다음과 같습니다. m_bWindowOnly = TRUE; 그 이후의 값은 절대로 변경되지 않습니다. – taxilian

관련 문제