先說實在的:最終解決辦法是實作IDocHostUIHandler接口,在GetHostInfo方法裡解決,但“實作接口”意味着QueryInterface、AddRef、Release三個方法必須實作,是以相關代碼是:
class CMyWebBrowser : public IDocHostUIHandler
{
public:
CMyWebBrowser() { m_cRef = 0; }
virtual ~CMyWebBrowser() {}
LONG m_cRef;
private:
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
{
HRESULT result = S_OK;
if (IsBadWritePtr(ppvObject, sizeof(LPVOID)))
result = E_INVALIDARG;
if (result == S_OK)
{
*ppvObject = NULL;
if ( IsEqualIID( riid, IID_IUnknown ) )
*ppvObject = this;
// else if ( IsEqualIID( riid, IID_IOleClientSite ) )
// *ppvObject = (IOleClientSite *) this;
else if ( IsEqualIID( riid, IID_IDocHostUIHandler ) )
*ppvObject = (IDocHostUIHandler *) this;
else
result = E_NOINTERFACE;
}
this->AddRef();
return result;
}
ULONG STDMETHODCALLTYPE AddRef(){
InterlockedIncrement(&m_cRef);
return m_cRef;
ULONG STDMETHODCALLTYPE Release() {
ULONG ulRefCount = InterlockedDecrement(&m_cRef);
return ulRefCount;
HRESULT STDMETHODCALLTYPE EnableModeless(BOOL fEnable) { return S_OK; }
HRESULT STDMETHODCALLTYPE FilterDataObject(IDataObject *pDO,IDataObject **ppDORet){return S_OK;}
HRESULT STDMETHODCALLTYPE GetDropTarget(IDropTarget *pDropTarget, IDropTarget **ppDropTarget){return S_OK;}
HRESULT STDMETHODCALLTYPE GetExternal(IDispatch **ppDispatch){return S_OK;}
HRESULT STDMETHODCALLTYPE GetOptionKeyPath(LPOLESTR *pchKey,DWORD dw){return S_OK;}
STDMETHOD(GetHostInfo)(DOCHOSTUIINFO *pInfo) {
pInfo->cbSize = sizeof(DOCHOSTUIINFO);
pInfo->dwFlags |= DOCHOSTUIFLAG_NO3DBORDER;
pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
pInfo->pchHostCss = 0;
pInfo->pchHostNS = 0;
return S_OK;
HRESULT STDMETHODCALLTYPE HideUI(VOID){return S_OK;}
HRESULT STDMETHODCALLTYPE OnDocWindowActivate(BOOL fActivate){return S_OK;}
HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(BOOL fActivate){return S_OK;}
HRESULT STDMETHODCALLTYPE ResizeBorder(LPCRECT prcBorder,IOleInPlaceUIWindow *pUIWindow,BOOL fFrameWindow){return S_OK;}
HRESULT STDMETHODCALLTYPE ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved,IDispatch *pdispReserved){return S_OK;}
HRESULT STDMETHODCALLTYPE ShowUI(DWORD dwID,
IOleInPlaceActiveObject *pActiveObject,
IOleCommandTarget *pCommandTarget,
IOleInPlaceFrame *pFrame,
IOleInPlaceUIWindow *pDoc
){return S_OK;}
HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpMsg,
const GUID *pguidCmdGroup,
DWORD nCmdID
)
{return S_OK;}
HRESULT STDMETHODCALLTYPE TranslateUrl(DWORD dwTranslate,
OLECHAR *pchURLIn,
OLECHAR **ppchURLOut
HRESULT STDMETHODCALLTYPE UpdateUI(VOID) {return S_OK;}
};
1.要寫的更通用一點,就是上述類就這麼些内容,然後WEBBrowser從這個類繼承。
2.除了實作這個接口外,别忘了SetUIHandler,這個不難查到,這裡就不寫了。
牢騷一下:項目中用到WEBBrowser,由于項目組中隻有我一個人做過WEB,是以這玩意一直是我維護,最近由于我給裡面的Html加了DocType,導緻WEBBrowser出現了3D邊框,不管是css的border:0還是body的leftmargin和topmargin,都不管用,查了很多資料(主要是google外國人的),都說實作IDocHostUIHandler接口,在GetHostInfo方法裡能幹掉3D邊框,但我按照網上做的,結果要麼報錯,要麼GetHostInfo不走,郁悶了我,折騰了兩天,最後幾乎不懂COM的我還是覺得QueryInterface等3個方法要實作,結果去查,果然如此,實作之後,搞定~~~