2009-12-11 70 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'

到註冊表中。這由瀏覽器使用,以決定如何初始化,並且該值具有OLEMISC_ACTIVATEWHENVISIBLE'or'ed(|)。補充說回來,一切都再次運作。

1

你試過返回OLEMISC_ACTIVATEWHENVISIBLEIOleObject::GetMiscStatus()裏面執行?

+0

從默認的ATL類,我有這樣的還有: DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE | OLEMISC_CANTLINKINSIDE | OLEMISC_INSIDEOUT | OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST ) 有什麼我可以做不經意地重寫? – taxilian 2009-12-12 06:03:02

+0

對不起,我不確定。這是我最好的猜測。 – 2009-12-12 17:58:06

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 2009-12-16 04:38:17