我有用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
從默認的ATL類,我有這樣的還有: DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE | OLEMISC_CANTLINKINSIDE | OLEMISC_INSIDEOUT | OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST ) 有什麼我可以做不經意地重寫? – taxilian 2009-12-12 06:03:02
對不起,我不確定。這是我最好的猜測。 – 2009-12-12 17:58:06