在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)
解决方案 »
- MFC求教
- 各位高手!vc中需要注册一些动态库!请问如何在注册?
- 怎么实现不了!!!!!!!!!!!!!!!
- 请教高手:程序从debug版改为release版出现这样的问题,为什么?
- 如何的方法可以使我的mfc应用程序自适应不同的两种计算机机分辨率?包括(1024*768和800*600),
- **-------简单问题 不知道有人回答么: 线程结束后, 线程句柄==NULL 了吗?--------------***
- VC调用DLL后,利用FreeLibrary释放该DLL时出错。
- 拜师学艺!(寻)
- 请各位帮帮忙!
- .exe文件的结构是怎样的?如何修改已有的.exe?
- 视频和图片转场特效???
- 关于用 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就可以了。