改写了一些代码,防止内存泄漏。
Sink了MessageBox等一些方法。
.h
#pragma once
#include <afxhtml.h>
//
class CHtmlSite;
class CHtmlCtrl;
class CHtmlManager : public COccManager
{
public:
CHtmlManager();
virtual COleControlSite * CreateSite(COleControlContainer * pOCC);
private:
CHtmlCtrl * m_pView;
CHtmlSite * m_pSite;
public:
void SetView(class CHtmlCtrl * pView)
{
m_pView = pView;
}
};
//
class CHtmlCtrl;
class CHtmlManager;
class CHtmlCtrl : public CHtmlView
{
public:
CHtmlCtrl();
~CHtmlCtrl() { }
CHtmlManager m_htmlManager;
CStatic wndStatic; //html控件将取代这个静态控件
void PrintUrl(CString url,CDC* _pDc);
CString mPrintUrl;
CDC* mpPrintDC;
//下面的是会造成内存泄漏的方法 重写补救
CString GetFullName() const;
CString GetType() const;
CString GetLocationName() const;
CString GetLocationURL() const;
void Navigate(LPCTSTR lpszURL, DWORD dwFlags = 0 ,
LPCTSTR lpszTargetFrameName = NULL ,
LPCTSTR lpszHeaders = NULL, LPVOID lpvPostData = NULL,
DWORD dwPostDataLen = 0);
//Add the following functions. This action prevents the leak because the
//CHtmlView versions of LoadFromResource() call CHtmlView::Navigate().
//These need to be defined because CHtmlView::Navigate() is not virtual.
BOOL LoadFromResource(LPCTSTR lpszResource);
BOOL LoadFromResource(UINT nRes);
//end new code
/不要修改
BOOL CreateFromStatic(UINT nID, CWnd* pParent);
// Normally, CHtmlView destroys itself in PostNcDestroy,
// but we don't want to do that for a control since a control
// is usually implemented as a stack object in a dialog.
//
virtual void PostNcDestroy() { }
// overrides to bypass MFC doc/view frame dependencies
afx_msg void OnDestroy();
afx_msg int OnMouseActivate(CWnd* pDesktopWnd,UINT nHitTest,UINT message);
// override to trap "app:" pseudo protocol
virtual void OnBeforeNavigate2( LPCTSTR lpszURL,DWORD nFlags,LPCTSTR lpszTargetFrameName,CByteArray& baPostedData,LPCTSTR lpszHeaders,BOOL* pbCancel );
// override to handle links to "app:mumble...". lpszWhere will be "mumble"
virtual void OnAppCmd(LPCTSTR lpszWhere);
DECLARE_EVENTSINK_MAP()
DECLARE_MESSAGE_MAP();
DECLARE_DYNAMIC(CHtmlCtrl)
afx_msg void OnSize(UINT nType, int cx, int cy);
///
BOOL CHtmlCtrl::CreateControlSite(COleControlContainer * pContainer,
COleControlSite ** ppSite, UINT /*nID*/, REFCLSID /*clsid*/);
virtual void OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel);
virtual void OnNavigateError(LPCTSTR lpszURL, LPCTSTR lpszFrame, DWORD dwError, BOOL *pbCancel);
virtual void OnNavigateComplete2(LPCTSTR strURL);
virtual void OnDocumentComplete(LPCTSTR lpszURL);
void NewWindow3(IDispatch **ppDisp, VARIANT_BOOL *Cancel, DWORD dwFlags,
BSTR bstrUrlContext, BSTR bstrUrl);
CComPtr<IHTMLWindow2> GetIHTMLWindow2();
BOOL CallJScript(const CString strFunc, const CStringArray& paramArray, CComVariant* pVarResult);
BOOL OnShowHelp(HWND hwnd,LPOLESTR pszHelpFile,UINT nCommand,DWORD dwData,
POINT ptMouse,IDispatch * pDispatchObjectHit);
BOOL OnShowMessage(HWND hwnd,LPOLESTR lpstrText,LPOLESTR lpstrCaption,DWORD dwType,
LPOLESTR lpstrHelpFile,DWORD dwHelpContext,LRESULT * plResult);
virtual BOOL PreTranslateMessage(MSG* pMsg);
};
class CHtmlSite : public COleControlSite
{
public:
CHtmlSite(COleControlContainer * pOCC);
virtual ~CHtmlSite();
private:
class CHtmlCtrl * m_pView;
public:
void SetView(class CHtmlCtrl * pView)
{
m_pView = pView;
}
// IDocHostShowUI
public:
BEGIN_INTERFACE_PART(DocHostShowUI, IDocHostShowUI)
INIT_INTERFACE_PART(CDocHostSite, DocHostShowUI)
STDMETHOD(ShowHelp)(
/* [in ] */ HWND hwnd,
/* [in ] */ LPOLESTR pszHelpFile,
/* [in ] */ UINT uCommand,
/* [in ] */ DWORD dwData,
/* [in ] */ POINT ptMouse,
/* [out] */ IDispatch __RPC_FAR *pDispatchObjectHit);
STDMETHOD(ShowMessage)(
/* [in ] */ HWND hwnd,
/* [in ] */ LPOLESTR lpstrText,
/* [in ] */ LPOLESTR lpstrCaption,
/* [in ] */ DWORD dwType,
/* [in ] */ LPOLESTR lpstrHelpFile,
/* [in ] */ DWORD dwHelpContext,
/* [out] */ LRESULT __RPC_FAR *plResult);
END_INTERFACE_PART(DocHostShowUI)
// IDocHostUIHandler
public:
BEGIN_INTERFACE_PART(DocHostUIHandler, 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);
END_INTERFACE_PART(DocHostUIHandler)
BEGIN_INTERFACE_PART(DocHostUIHandler2, IDocHostUIHandler2)
STDMETHOD(GetOverrideKeyPath)(
/* [out] */ LPOLESTR __RPC_FAR *pchKey,
/* [in] */ DWORD dw);
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);
END_INTERFACE_PART(DocHostUIHandler2)
DECLARE_INTERFACE_MAP()
};
//
// Construction/Destruction
//
.cpp
#include "StdAfx.h"
#include "CHtmlCtrl.h"
IMPLEMENT_DYNAMIC(CHtmlCtrl, CHtmlView)
BEGIN_MESSAGE_MAP(CHtmlCtrl, CHtmlView)
ON_WM_DESTROY()
ON_WM_MOUSEACTIVATE()
ON_WM_SIZE()
END_MESSAGE_MAP()
#include <exdispid.h>
BEGIN_EVENTSINK_MAP(CHtmlCtrl, CHtmlView)
ON_EVENT(CHtmlCtrl, AFX_IDW_PANE_FIRST,DISPID_NEWWINDOW3,NewWindow3,VTS_PDISPATCH VTS_PBOOL VTS_I4 VTS_BSTR VTS_BSTR)
END_EVENTSINK_MAP()
void CHtmlCtrl::NewWindow3(
IDispatch **ppDisp,
VARIANT_BOOL *Cancel,
DWORD dwFlags,
BSTR bstrUrlContext,
BSTR bstrUrl
)
{
*Cancel=VARIANT_TRUE;
}
CHtmlCtrl::CHtmlCtrl()
{
}
//
// Create control in same position as an existing static control with
// the same ID (could be any kind of control, really)
//
BOOL CHtmlCtrl::CreateFromStatic(UINT nID, CWnd* pParent)
{
CRect rect(0,0,2000,5000);
rect.MoveToXY(0,0);
wndStatic.Create(L"",WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN,rect,pParent,nID);
// if (!wndStatic.SubclassDlgItem(nID, pParent))
// return FALSE;
// Get static control rect, convert to parent's client coords.
CRect rc;
wndStatic.GetWindowRect(&rc);
pParent->ScreenToClient(&rc);
wndStatic.DestroyWindow();
// create HTML control (CHtmlView)
return Create(NULL, // class name
NULL, // title
(WS_CHILD | WS_VISIBLE|WS_CLIPCHILDREN ), // style
rc, // rectangle
pParent, // parent
nID, // control ID
NULL); // frame/doc context not used
}
// Override to avoid CView stuff that assumes a frame.
//
void CHtmlCtrl::OnDestroy()
{
// This is probably unecessary since ~CHtmlView does it, but
// safer to mimic CHtmlView::OnDestroy.
if (m_pBrowserApp) {
//m_pBrowserApp->Release();
m_pBrowserApp = NULL;
}
CWnd::OnDestroy(); // bypass CView doc/frame stuff
}
// Override to avoid CView stuff that assumes a frame.
//
int CHtmlCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg)
{
// bypass CView doc/frame stuff
return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, msg);
}
//
// Override navigation handler to pass to "app:" links to virtual handler.
// Cancels the navigation in the browser, since app: is a pseudo-protocol.
//
void CHtmlCtrl::OnAppCmd(LPCTSTR lpszWhere)
{
}
void CHtmlCtrl::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy); //注意此处一定要是CFormView
// TODO: 在此处添加消息处理程序代码
if (::IsWindow(m_wndBrowser.m_hWnd))
{
CRect rect;
GetClientRect(rect);
::AdjustWindowRectEx(rect, GetStyle(), FALSE, WS_EX_CLIENTEDGE);
m_wndBrowser.SetWindowPos(NULL, rect.left,rect.top, rect.Width(),rect.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
}
}
CString CHtmlCtrl::GetFullName() const
{
ASSERT(m_pBrowserApp != NULL);
BSTR bstr;
m_pBrowserApp->get_FullName(&bstr);
CString retVal(bstr);
SysFreeString(bstr); // Added this line to prevent leak.
return retVal;
}
CString CHtmlCtrl::GetType() const
{
ASSERT(m_pBrowserApp != NULL);
BSTR bstr;
m_pBrowserApp->get_Type(&bstr);
CString retVal(bstr);
SysFreeString(bstr); // Added this line to prevent leak.
return retVal;
}
CString CHtmlCtrl::GetLocationName() const
{
ASSERT(m_pBrowserApp != NULL);
BSTR bstr;
m_pBrowserApp->get_LocationName(&bstr);
CString retVal(bstr);
SysFreeString(bstr); // Added this line to prevent leak.
return retVal;
}
CString CHtmlCtrl::GetLocationURL() const
{
ASSERT(m_pBrowserApp != NULL);
BSTR bstr;
m_pBrowserApp->get_LocationURL(&bstr);
CString retVal(bstr);
SysFreeString(bstr); // Added this line to prevent leak.
return retVal;
}
void CHtmlCtrl::Navigate(LPCTSTR lpszURL, DWORD dwFlags /* = 0 */,
LPCTSTR lpszTargetFrameName /* = NULL */ ,
LPCTSTR lpszHeaders /* = NULL */, LPVOID lpvPostData /* = NULL */,
DWORD dwPostDataLen /* = 0 */)
{
CString strURL(lpszURL);
BSTR bstrURL = strURL.AllocSysString();
COleSafeArray vPostData;
if (lpvPostData != NULL)
{
if (dwPostDataLen == 0)
dwPostDataLen = lstrlen((LPCTSTR) lpvPostData);
vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
}
m_pBrowserApp->Navigate(bstrURL, COleVariant((long) dwFlags, VT_I4), COleVariant(lpszTargetFrameName, VT_BSTR),
vPostData, COleVariant(lpszHeaders, VT_BSTR));
SysFreeString(bstrURL); // Added this line to prevent leak.
}
BOOL CHtmlCtrl::LoadFromResource(LPCTSTR lpszResource)
{
HINSTANCE hInstance = AfxGetResourceHandle();
ASSERT(hInstance != NULL);
CString strResourceURL;
BOOL bRetVal = TRUE;
LPTSTR lpszModule = new TCHAR[_MAX_PATH];
if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
{
strResourceURL.Format(_T("res://%s/%s"), lpszModule, lpszResource);
Navigate(strResourceURL, 0, 0, 0);
}
else
bRetVal = FALSE;
delete [] lpszModule;
return bRetVal;
}
BOOL CHtmlCtrl::LoadFromResource(UINT nRes)
{
HINSTANCE hInstance = AfxGetResourceHandle();
ASSERT(hInstance != NULL);
CString strResourceURL;
BOOL bRetVal = TRUE;
LPTSTR lpszModule = new TCHAR[_MAX_PATH];
if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
{
strResourceURL.Format(_T("res://%s/%d"), lpszModule, nRes);
Navigate(strResourceURL, 0, 0, 0);
}
else
bRetVal = FALSE;
delete [] lpszModule;
return bRetVal;
}
//
BOOL CHtmlCtrl::OnShowHelp(HWND hwnd,LPOLESTR pszHelpFile,UINT nCommand,DWORD dwData,
POINT ptMouse,IDispatch * pDispatchObjectHit)
{
CString text=pszHelpFile;text=L"help:"+text;
OutputDebugString(text+L"\r\n");
return S_OK;
}
BOOL CHtmlCtrl::OnShowMessage(HWND hwnd,LPOLESTR lpstrText,LPOLESTR lpstrCaption,DWORD dwType,
LPOLESTR lpstrHelpFile,DWORD dwHelpContext,LRESULT * plResult)
{
return S_OK;
}
BOOL CHtmlCtrl::CreateControlSite(COleControlContainer * pContainer,
COleControlSite ** ppSite, UINT /*nID*/, REFCLSID /*clsid*/)
{
m_htmlManager.SetView(this);
*ppSite = m_htmlManager.CreateSite( pContainer );
return (*ppSite) ? TRUE : FALSE;
}
void CHtmlCtrl::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel)
{
// TODO: 在此添加专用代码和/或调用基类
//默认是不允许在新窗口中打开
CHtmlView::OnNewWindow2(ppDisp, Cancel);
}
void CHtmlCtrl::OnNavigateError(LPCTSTR lpszURL, LPCTSTR lpszFrame, DWORD dwError, BOOL *pbCancel)
{
// TODO: 在此添加专用代码和/或调用基类
CHtmlView::OnNavigateError(lpszURL, lpszFrame, dwError, pbCancel);
}
void CHtmlCtrl::OnBeforeNavigate2( LPCTSTR lpszURL, DWORD nFlags,LPCTSTR lpszTargetFrameName,
CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel )
{
//处理允许访问的url,不允许访问的url直接禁止访问
CHtmlView::OnBeforeNavigate2( lpszURL, nFlags, lpszTargetFrameName,
baPostedData, lpszHeaders, pbCancel );
}
void CHtmlCtrl::OnNavigateComplete2(LPCTSTR strURL)
{
// TODO: 在此添加专用代码和/或调用基类
}
void CHtmlCtrl::PrintUrl( CString url,CDC* _pDc )
{
mPrintUrl=url;
mpPrintDC=_pDc;
Navigate(url);
}
void CHtmlCtrl::OnDocumentComplete(LPCTSTR lpszURL)
{
CHtmlView::OnDocumentComplete(lpszURL);
CString url=lpszURL;
if(url==mPrintUrl&&mpPrintDC!=NULL)
{
ShowWindow(TRUE);
CComPtr<IHTMLWindow2> window2=GetIHTMLWindow2();
CComPtr<IHTMLDocument2> document;
window2->get_document(&document);
CComPtr<IHTMLElement> element;
document->get_body(&element);
CComPtr<IHTMLElementRender> elementRender;
element->QueryInterface(IID_IHTMLElementRender,(void**)&elementRender);
elementRender->DrawToDC(mpPrintDC->GetSafeHdc());
// BOOL s=PrintWindow(mpPrintDC,0);
// ShowWindow(FALSE);
// if(s==FALSE)
// {
// OutputDebugString(url+_T("PrintWindow失败!\n"));
// }
ShowWindow(FALSE);
}
// TODO: 在此添加专用代码和/或调用基类
}
CComPtr<IHTMLWindow2> CHtmlCtrl::GetIHTMLWindow2()
{
CComPtr<IHTMLDocument> IEDocument=NULL;
HRESULT hr=NULL;
hr=m_pBrowserApp->get_Document((IDispatch **)&IEDocument);
if (FAILED(hr))return NULL;
CComPtr<IHTMLDocument2>IEDocument2=NULL;
hr=IEDocument->QueryInterface(IID_IHTMLDocument2,(void**)&IEDocument2);
if (FAILED(hr))return NULL;
CComPtr<IHTMLWindow2>IEWindow2; //相当于html中的document
hr=IEDocument2->get_parentWindow(&IEWindow2);
if (FAILED(hr))return NULL;
return IEWindow2;
CComPtr<IHTMLDocument3>IEDocument3;
IEDocument->QueryInterface(IID_IHTMLDocument3,(void**)&IEDocument3);
}
BOOL CHtmlCtrl::CallJScript(const CString strFunc, const CStringArray& paramArray, CComVariant* pVarResult)
{
CComPtr<IDispatch> spScript;
CComPtr<IHTMLDocument> m_spHtmlDoc=NULL;
m_pBrowserApp->get_Document((IDispatch **)&m_spHtmlDoc);
if (NULL==m_spHtmlDoc)
{
return FALSE;
}
HRESULT hr;
hr = m_spHtmlDoc->get_Script(&spScript);
if(!SUCCEEDED(hr))
{
return FALSE;
}
CComBSTR bstrMember(strFunc);
DISPID dispid = NULL;
hr = spScript->GetIDsOfNames(IID_NULL,&bstrMember,1,
LOCALE_SYSTEM_DEFAULT,&dispid);
if(FAILED(hr))
{
return FALSE;
}
const int arraySize = paramArray.GetSize();
DISPPARAMS dispparams;
memset(&dispparams, 0, sizeof dispparams);
dispparams.cArgs = arraySize;
dispparams.rgvarg = new VARIANT[dispparams.cArgs];
for( int i = 0; i < arraySize; i++)
{
CComBSTR bstr = paramArray.GetAt(arraySize - 1 - i); // back reading
bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
dispparams.rgvarg[i].vt = VT_BSTR;
}
dispparams.cNamedArgs = 0;
EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof excepInfo);
CComVariant vaResult;
UINT nArgErr = (UINT)-1; // initialize to invalid arg
hr = spScript->Invoke(dispid,IID_NULL,0,
DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);
delete [] dispparams.rgvarg;
if(FAILED(hr))
{
return FALSE;
}
// *pVarResult = vaResult;
pVarResult->Copy(&vaResult);
return TRUE;
}
BOOL CHtmlCtrl::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message==WM_CLOSE)
{
return TRUE;
}
if(pMsg->message==WM_CREATE)
{
OutputDebugString(L"create\r\n");
}
return CHtmlView::PreTranslateMessage(pMsg);
}
//
BEGIN_INTERFACE_MAP(CHtmlSite, COleControlSite)
INTERFACE_PART(CHtmlSite, IID_IDocHostShowUI, DocHostShowUI)
INTERFACE_PART(CHtmlSite, IID_IDocHostUIHandler, DocHostUIHandler)
INTERFACE_PART(CHtmlSite, IID_IDocHostUIHandler2, DocHostUIHandler2)
END_INTERFACE_MAP()
CHtmlSite::CHtmlSite(COleControlContainer * pOcc)
: COleControlSite( pOcc ),
m_pView( NULL )
{
}
CHtmlSite::~CHtmlSite()
{
}
ULONG CHtmlSite::XDocHostShowUI::AddRef()
{
METHOD_PROLOGUE(CHtmlSite, DocHostShowUI);
return pThis->ExternalAddRef();
}
ULONG CHtmlSite::XDocHostShowUI::Release()
{
METHOD_PROLOGUE(CHtmlSite, DocHostShowUI);
return pThis->ExternalRelease();
}
HRESULT CHtmlSite::XDocHostShowUI::QueryInterface(REFIID riid, void ** ppvObj)
{
METHOD_PROLOGUE(CHtmlSite, DocHostShowUI);
return pThis->ExternalQueryInterface( &riid, ppvObj );
}
HRESULT CHtmlSite::XDocHostShowUI::ShowHelp(HWND hwnd,
LPOLESTR pszHelpFile,
UINT nCommand,
DWORD dwData,
POINT ptMouse,
IDispatch * pDispatchObjectHit)
{
METHOD_PROLOGUE(CHtmlSite, DocHostShowUI);
return pThis->m_pView->OnShowHelp( hwnd, pszHelpFile, nCommand, dwData, ptMouse,
pDispatchObjectHit );
}
HRESULT CHtmlSite::XDocHostShowUI::ShowMessage(HWND hwnd,
LPOLESTR lpstrText,
LPOLESTR lpstrCaption,
DWORD dwType,
LPOLESTR lpstrHelpFile,
DWORD dwHelpContext,
LRESULT * plResult)
{
METHOD_PROLOGUE(CHtmlSite, DocHostShowUI);
return pThis->m_pView->OnShowMessage( hwnd, lpstrText, lpstrCaption, dwType,
lpstrHelpFile, dwHelpContext, plResult );
}
ULONG CHtmlSite::XDocHostUIHandler::AddRef()
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->ExternalAddRef();
}
ULONG CHtmlSite::XDocHostUIHandler::Release()
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->ExternalRelease();
}
HRESULT CHtmlSite::XDocHostUIHandler::QueryInterface(REFIID riid, void ** ppvObj)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->ExternalQueryInterface( &riid, ppvObj );
}
HRESULT CHtmlSite::XDocHostUIHandler::GetHostInfo(DOCHOSTUIINFO * pInfo)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnGetHostInfo( pInfo );
}
HRESULT CHtmlSite::XDocHostUIHandler::ShowUI(DWORD dwID,
IOleInPlaceActiveObject * pActiveObject,
IOleCommandTarget * pCommandTarget,
IOleInPlaceFrame * pFrame,
IOleInPlaceUIWindow * pDoc)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnShowUI( dwID, pActiveObject, pCommandTarget,
pFrame, pDoc );
}
HRESULT CHtmlSite::XDocHostUIHandler::HideUI()
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnHideUI();
}
HRESULT CHtmlSite::XDocHostUIHandler::UpdateUI()
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnUpdateUI();
}
HRESULT CHtmlSite::XDocHostUIHandler::EnableModeless(BOOL fEnable)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnEnableModeless( fEnable );
}
HRESULT CHtmlSite::XDocHostUIHandler::OnDocWindowActivate(BOOL fEnable)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnDocWindowActivate( fEnable );
}
HRESULT CHtmlSite::XDocHostUIHandler::OnFrameWindowActivate(BOOL fEnable)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnFrameWindowActivate( fEnable );
}
HRESULT CHtmlSite::XDocHostUIHandler::ResizeBorder(LPCRECT prcBorder,
IOleInPlaceUIWindow * pUIWindow,
BOOL fFrameWindow)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnResizeBorder( prcBorder, pUIWindow, fFrameWindow );
}
HRESULT CHtmlSite::XDocHostUIHandler::ShowContextMenu(DWORD dwID,
POINT * ppt,
IUnknown * pcmdtReserved,
IDispatch * pdispReserved)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnShowContextMenu( dwID, ppt, pcmdtReserved,
pdispReserved );
}
HRESULT CHtmlSite::XDocHostUIHandler::TranslateAccelerator(LPMSG lpMsg,
const GUID * pguidCmdGroup,
DWORD nCmdID)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnTranslateAccelerator( lpMsg,
pguidCmdGroup, nCmdID );
}
HRESULT CHtmlSite::XDocHostUIHandler::GetOptionKeyPath(LPOLESTR * pchKey,
DWORD dw)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnGetOptionKeyPath( pchKey, dw );
}
HRESULT CHtmlSite::XDocHostUIHandler::GetDropTarget(IDropTarget * pDropTarget,
IDropTarget ** ppDropTarget)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnGetDropTarget( pDropTarget, ppDropTarget );
}
HRESULT CHtmlSite::XDocHostUIHandler::GetExternal(IDispatch ** ppDispatch)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnGetExternal( ppDispatch );
}
HRESULT CHtmlSite::XDocHostUIHandler::TranslateUrl(DWORD dwTranslate,
OLECHAR * pchURLIn,
OLECHAR ** ppchURLOut)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnTranslateUrl( dwTranslate, pchURLIn, ppchURLOut );
}
HRESULT CHtmlSite::XDocHostUIHandler::FilterDataObject(IDataObject * pDO,
IDataObject ** ppDORet)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler);
return pThis->m_pView->OnFilterDataObject( pDO, ppDORet );
}
ULONG CHtmlSite::XDocHostUIHandler2::AddRef()
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler2);
return pThis->ExternalAddRef();
}
ULONG CHtmlSite::XDocHostUIHandler2::Release()
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler2);
return pThis->ExternalRelease();
}
HRESULT CHtmlSite::XDocHostUIHandler2::QueryInterface(REFIID riid, void ** ppvObj)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler2);
return pThis->ExternalQueryInterface( &riid, ppvObj );
}
HRESULT CHtmlSite::XDocHostUIHandler2::GetHostInfo(DOCHOSTUIINFO *)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::ShowUI(DWORD /*dwID*/,
IOleInPlaceActiveObject * /*pActiveObject*/,
IOleCommandTarget * /*pCommandTarget*/,
IOleInPlaceFrame * /*pFrame*/,
IOleInPlaceUIWindow * /*pDoc*/)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::HideUI()
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::UpdateUI()
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::EnableModeless(BOOL /*fEnable*/)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::OnDocWindowActivate(BOOL /*fActivate*/)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::OnFrameWindowActivate(BOOL /*fActivate*/)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::ResizeBorder(LPCRECT /*prcBorder*/,
IOleInPlaceUIWindow* /*pUIWindow*/,
BOOL /*fRameWindow*/)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::ShowContextMenu(DWORD /*dwID*/,
POINT* /*pptPosition*/,
IUnknown* /*pCommandTarget*/,
IDispatch* /*pDispatchObjectHit*/)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::TranslateAccelerator(LPMSG /*lpMsg*/,
const GUID * /*pguidCmdGroup*/,
DWORD /*nCmdID*/)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::GetOptionKeyPath(BSTR* /*pbstrKey*/, DWORD)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::GetDropTarget(IDropTarget * /*pDropTarget*/,
IDropTarget ** /*ppDropTarget*/)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::GetExternal(IDispatch ** /*ppDispatch*/)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::TranslateUrl(DWORD /*dwTranslate*/,
OLECHAR * /*pchURLIn*/,
OLECHAR ** /*ppchURLOut*/)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::FilterDataObject(IDataObject * /*pDO*/,
IDataObject ** /*ppDORet*/)
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT CHtmlSite::XDocHostUIHandler2::GetOverrideKeyPath(LPOLESTR * pchKey, DWORD dw)
{
METHOD_PROLOGUE(CHtmlSite, DocHostUIHandler2);
return S_OK;
//return pThis->m_pView->OnGetOverrideKeyPath( pchKey, dw );
}
CHtmlManager::CHtmlManager()
: m_pView( NULL ),
m_pSite( NULL )
{
}
COleControlSite * CHtmlManager::CreateSite(COleControlContainer * pOcc)
{
m_pSite = new CHtmlSite( pOcc );
m_pSite->SetView( m_pView );
return m_pSite;
}