我有一个用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
答案 0 :(得分:2)
我找到了罪魁祸首。显然,OLEMSIC_ACTIVATEWHENVISIBLE用于在.rgs文件中自动生成%OLEMISC%变量。但是,我已经覆盖了默认的rgs处理以提供我自己的变量,并且在此过程中删除了一个关键行,这将添加一个:
[CLSID]/MiscStatus/1 = s '131473'
到注册表。浏览器使用这个来决定如何初始化,并且该值具有OLEMISC_ACTIVATEWHENVISIBLE'或'(|)。添加回来,一切都恢复正常。
答案 1 :(得分:1)
您是否尝试在OLEMISC_ACTIVATEWHENVISIBLE
实施中返回IOleObject::GetMiscStatus()
?
答案 2 :(得分:1)