继承CHtmlView类的h 和cpp


改写了一些代码,防止内存泄漏。

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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值