ATP控件上的InPlaceActivate直到鼠标事件才被调用

时间:2009-12-11 22:10:27

标签: c++ internet-explorer com activex atl

我有一个用C ++编写的ActiveX控件,我用VS2008和ATL创建。在大多数情况下,它是一个非常标准(没有从原始模板修改很多)控件,除了不是使用IDispatchImpl,我已经创建了自己的IDispatchEx实现。此控件仅在Internet Explorer中使用,我主要使用IE8进行测试。

一切都很好,除了由于某种原因,在我将鼠标移动到浏览器中托管对象标记的区域之前,不会调用InPlaceActivate。没有创建窗口,没有发送WM_CREATE消息等

我尝试过实施DISPID_READYSTATE,但似乎没有任何帮助。如果我从InPlaceActivate(OLEIVERB_UIACTIVATE);方法调用SetClientSite并且它通常有效,但这通常不是必需的。

为什么会这样?浏览器如何确定何时调用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

3 个答案:

答案 0 :(得分:2)

我找到了罪魁祸首。显然,OLEMSIC_ACTIVATEWHENVISIBLE用于在.rgs文件中自动生成%OLEMISC%变量。但是,我已经覆盖了默认的rgs处理以提供我自己的变量,并且在此过程中删除了一个关键行,这将添加一个:

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

到注册表。浏览器使用这个来决定如何初始化,并且该值具有OLEMISC_ACTIVATEWHENVISIBLE'或'(|)。添加回来,一切都恢复正常。

答案 1 :(得分:1)

您是否尝试在OLEMISC_ACTIVATEWHENVISIBLE实施中返回IOleObject::GetMiscStatus()

答案 2 :(得分:1)

如果您只想确保为脚本创建窗口,则可以更早地创建窗口,如中所述 PRB: ActiveX Control Window Is Not Created Until Visible in Internet Explorer

另见IE Automatic Component Activation (Changes to IE ActiveX Update)