在BHO中实现了IDocHostUIHandler接口...
其中的方法GetExternal()出现了错误...
(情况1)
XXX::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
return E_NOTIMPL; // IE8中...打开另外一个新的标签时提示"错误: 尚未实现"
}(情况2)
XXX::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
return S_OK; // IE8中...打开另外一个新的标签时提示"错误: 'window.external' 为空或不是对象"
}(情况3)
XXX::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
*ppDispatch = NULL;
return S_FALSE; // IE8中...打开另外一个新的标签时提示"错误: 'window.external' 为空或不是对象"
}(情况4)
XXX::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
*ppDispatch = (IDispatch*)this;
return S_OK; // IE8中...打开另外一个新的标签时提示"错误: 意外地调用了方法或属性访问。"
}到底怎么实现呢...请指点(MSDN上在讲contextmenu时...好像用theapp.m_...在我的BHO中theapp代表什么呢...)
http://support.microsoft.com/kb/272968/zh-cnSTDMETHODIMP CCustomControlSite::XDocHostUIHandler2::GetExternal(
/* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
// Return the IDispatch that you have to extend the object model.
IDispatch* pDisp = (IDispatch*)theApp.m_pDispOM; // 在BHO中...这句怎么写呢..???
pDisp->AddRef();
*ppDispatch = pDisp;
return S_OK;
}
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDD, &CLSID_DD>,
public IObjectWithSiteImpl<CDD>,
public IDispatchImpl<IDD, &IID_IDD, &LIBID_DragDropLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDocHostUIHandler,{
public:
CDD()
{
}DECLARE_REGISTRY_RESOURCEID(IDR_DD)DECLARE_NOT_AGGREGATABLE(CDD)BEGIN_COM_MAP(CDD)
COM_INTERFACE_ENTRY(IDD)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY(IDocHostUIHandler)END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct()
{
return S_OK;
} void FinalRelease()
{
}public: // IDocHostUIHandler STDMETHOD(ShowContextMenu)(/* [in] */ DWORD dwID,
/* [in] */ POINT __RPC_FAR *ppt,
/* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
/* [in] */ IDispatch __RPC_FAR *pdispReserved);
STDMETHOD(GetHostInfo)(
/* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo);
STDMETHOD(ShowUI)(
/* [in] */ DWORD dwID,
/* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,
/* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget,
/* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame,
/* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc);
STDMETHOD(HideUI)(void);
STDMETHOD(UpdateUI)(void);
STDMETHOD(EnableModeless)(/* [in] */ BOOL fEnable);
STDMETHOD(OnDocWindowActivate)(/* [in] */ BOOL fEnable);
STDMETHOD(OnFrameWindowActivate)(/* [in] */ BOOL fEnable);
STDMETHOD(ResizeBorder)(
/* [in] */ LPCRECT prcBorder,
/* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
/* [in] */ BOOL fRameWindow);
STDMETHOD(TranslateAccelerator)(
/* [in] */ LPMSG lpMsg,
/* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
/* [in] */ DWORD nCmdID);
STDMETHOD(GetOptionKeyPath)(
/* [out] */ LPOLESTR __RPC_FAR *pchKey,
/* [in] */ DWORD dw);
STDMETHOD(GetDropTarget)(
/* [in] */ IDropTarget __RPC_FAR *pDropTarget,
/* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget);
STDMETHOD(GetExternal)(
/* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch);
STDMETHOD(TranslateUrl)(
/* [in] */ DWORD dwTranslate,
/* [in] */ OLECHAR __RPC_FAR *pchURLIn,
/* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut);
STDMETHOD(FilterDataObject)(
/* [in] */ IDataObject __RPC_FAR *pDO,
/* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet); IDispatch *pDisp;
};OBJECT_ENTRY_AUTO(__uuidof(DD), CDD)
{
AddRef();
*ppDispatch = (IDispatch*)this;
return S_OK; // IE8中...打开另外一个新的标签时提示"错误: 意外地调用了方法或属性访问。"
}这样实现应该就可以了
http://www.eb163.com/club/thread-990-1-1.html
先按这样整着吧...
有啥好的提示说下啊...呵呵...明结贴...
哦,没注意看你的定义,确实要实现IDispatch接口,因为IE会调用IDispatch的方法。
回傳一個物件時,UIHost 物件就被改寫,此時開新頁簽會失敗,原因是新頁簽預期的window.external.addTab(),這個方法addTab()你的物件並沒有實做,因此出現錯誤。這個問題基本上沒解。