在BHO中...使用一个类CDD实现了IDocHostUIHandle, IE使用此BHO时出现JS方面的错误...初步判断是GetExternal()方法重载时出现错误, 我只是简单的返回E_NOTIMPL...不知各位有何建议...class ATL_NO_VTABLE CDD :
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)
解决方案 »
- CLiveView类中获取当前选中整行的第一列上的数据//是什么函数?
- 位图画刷填充的区域背景不随图形一起移动
- 入门级算法书, (C编写)??
- 为什么程序执行到rs_fee.Open(CRecordset::forwardOnly,strSqlCom,CRecordset::none)时停止反应了?(急!!!!!)
- 如何运行 已映射在内存中(0xFFFFFFFF)的Exe文件
- 打开IE页面的问题(高分求教,急)
- windows2000里的启动栏的东西怎么去掉?
- 求长期学习MFC 小伙伴一枚!
- 请教在VC平台上实现视频图像去隔行效应的算法代码?
- 坐标变换
- 视频和图片转场特效???
- 关于用 win32编写 类似Logo语言中的海龟画图问题
{
*ppDispatch = NULL;
return E_NOTIMPL;
}
2. 设置为NULL...出现错误提示
如果你需要设自己的external,返回S_OK。否则返回S_FALSE。如果需要报告错误,返回一个错误代码(比如E_ACCESSDENIED)
我需要的是用IE原来默认的IDispatch...但不知在BHO中怎么得到...我现在是在DownloadComplete()中 HRESULT hr;
CComPtr<IDispatch> spDisp; hr = m_spWebBrowser->get_Document(&spDisp);
if ( SUCCEEDED(hr) )
{
CComQIPtr<IHTMLDocument2> spHtmlDoc(spDisp);
if (spHtmlDoc)
{
CComPtr<IHTMLWindow2> spWindow;
spHtmlDoc->get_parentWindow(&spWindow);
if (spWindow)
{
spWindow->get_external(&m_spExtDisp);
}
}
}
在GetExternal()中
*ppDispatch = m_spExtDisp;
return S_OK;
不知思路是否正确
没有别的方法了吗...?
我现在只是在BHO中实现鼠标的托动...至于动那么大干戈吗...?
我按你的思路去试了一下,是可以的。就是把原IHTMLWindows的external传给ppDispatch就可以了。