⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 customcontrolsite.cpp

📁 webbrowser
💻 CPP
字号:
// CustomControlSite.cpp: implementation of the CCustomControlSite class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "IEAutomation.h"
#include "IEAutomationView.h"
#include "DlgAuthenticate.h"

#include <Transact.h>
#undef AFX_DATA
#define AFX_DATA AFX_DATA_IMPORT
// NOTE: This line is a hardcoded reference to an MFC header file
//  this path may need to be changed to refer to the location of VC5 install
//  for successful compilation.
#include <..\src\occimpl.h>
#undef AFX_DATA
#define AFX_DATA AFX_DATA_EXPORT
#include "CustomControlSite.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
BEGIN_INTERFACE_MAP(CCustomControlSite, COleControlSite)
	INTERFACE_PART(CCustomControlSite, IID_IDocHostUIHandler2, DocHostUIHandler2)
	INTERFACE_PART(CCustomControlSite, IID_IDocHostUIHandler, DocHostUIHandler2)
	INTERFACE_PART(CCustomControlSite, IID_IAuthenticate, Authenticate)
	INTERFACE_PART(CCustomControlSite, IID_IServiceProvider, ServiceProvider)
END_INTERFACE_MAP()

CCustomControlSite::CCustomControlSite(COleControlContainer *pCnt)
:COleControlSite(pCnt)
{
	m_pCustomImpl=NULL;
	//since only pCnt->m_pWnd is valid,
	//and can not derive a class from COleControlContainer in MFC6
	//use dynamic casting for pCnt->m_pWnd here
	CWnd* pWnd=pCnt->m_pWnd;
	if(pWnd){
		if(pWnd->IsKindOf(RUNTIME_CLASS(CIEAutomationView))){
			CIEAutomationView* pView=(CIEAutomationView*)pWnd;
			m_pCustomImpl=pView;
		}
	}
	
}

CCustomControlSite::~CCustomControlSite()
{

}
ULONG FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::AddRef()
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	return pThis->ExternalAddRef();
}


ULONG FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::Release()
{                            
    METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	return pThis->ExternalRelease();
}

HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::QueryInterface(REFIID riid, void **ppvObj)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
    HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
	return hr;
}

// * CImpIDocHostUIHandler::GetHostInfo
// *
// * Purpose: Called at initialization
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::GetHostInfo( DOCHOSTUIINFO* pInfo )
{

	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
//	pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;
//  pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->GetHostInfo(pInfo );
	}
    return S_OK;
}

// * CImpIDocHostUIHandler::ShowUI
// *
// * Purpose: Called when MSHTML.DLL shows its UI
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::ShowUI(
				DWORD dwID, 
				IOleInPlaceActiveObject * pActiveObject,
				IOleCommandTarget * pCommandTarget,
				IOleInPlaceFrame * pFrame,
				IOleInPlaceUIWindow * pDoc)
{

	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	// We've already got our own UI in place so just return S_OK
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->ShowUI(
				 dwID, 
				 pActiveObject,
				 pCommandTarget,
				 pFrame,
				 pDoc);
	}
    return E_NOTIMPL;
  //return S_OK;
}

// * CImpIDocHostUIHandler::HideUI
// *
// * Purpose: Called when MSHTML.DLL hides its UI
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::HideUI(void)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->HideUI( );
	}
	return E_NOTIMPL;
     //return S_OK;
}

// * CImpIDocHostUIHandler::UpdateUI
// *
// * Purpose: Called when MSHTML.DLL updates its UI
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::UpdateUI(void)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	// MFC is pretty good about updating it's UI in it's Idle loop so I don't do anything here
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->UpdateUI( );
	}
	return E_NOTIMPL;
	//return S_OK;
}

// * CImpIDocHostUIHandler::EnableModeless
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::EnableModeless
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::EnableModeless(BOOL fEnable)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->EnableModeless(fEnable);
	}
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::OnDocWindowActivate
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnDocWindowActivate
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::OnDocWindowActivate(BOOL fActivate)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->OnDocWindowActivate(fActivate);
	}
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::OnFrameWindowActivate
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnFrameWindowActivate
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::OnFrameWindowActivate(BOOL fActivate)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->OnFrameWindowActivate(fActivate);
	}
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::ResizeBorder
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::ResizeBorder
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::ResizeBorder(
				LPCRECT prcBorder, 
				IOleInPlaceUIWindow* pUIWindow,
				BOOL fRameWindow)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->ResizeBorder(
				prcBorder, 
				pUIWindow,
				fRameWindow);
	}
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::ShowContextMenu
// *
// * Purpose: Called when MSHTML.DLL would normally display its context menu
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::ShowContextMenu(
				DWORD dwID, 
				POINT* pptPosition,
				IUnknown* pCommandTarget,
				IDispatch* pDispatchObjectHit)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->ShowContextMenu(
				dwID, 
				pptPosition,
				pCommandTarget,
				pDispatchObjectHit);
	}
	return E_NOTIMPL;
    //return S_OK; // We've shown our own context menu. MSHTML.DLL will no longer try to show its own.
}

// * CImpIDocHostUIHandler::TranslateAccelerator
// *
// * Purpose: Called from MSHTML.DLL's TranslateAccelerator routines
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::TranslateAccelerator(LPMSG lpMsg,
            /* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
            /* [in] */ DWORD nCmdID)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
 	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->TranslateAccelerator(lpMsg,
            /* [in] */ pguidCmdGroup,
            /* [in] */ nCmdID);
	}
    return E_NOTIMPL;   
	//return S_FALSE;
}

// * CImpIDocHostUIHandler::GetOptionKeyPath
// *
// * Purpose: Called by MSHTML.DLL to find where the host wishes to store 
// *	its options in the registry
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::GetOptionKeyPath(BSTR* pbstrKey, DWORD	dw)
{

	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->GetOptionKeyPath(pbstrKey, dw);
	}
	return E_NOTIMPL;
}

STDMETHODIMP CCustomControlSite::XDocHostUIHandler2::GetDropTarget( 
            /* [in] */ IDropTarget __RPC_FAR *pDropTarget,
            /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->GetDropTarget( 
            /* [in] */ pDropTarget,
            /* [out] */ ppDropTarget);
	}
	return E_NOTIMPL;
}


STDMETHODIMP CCustomControlSite::XDocHostUIHandler2::GetExternal( 
            /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
	// return the IDispatch we have for extending the object Model
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->GetExternal( 
            /* [out] */ ppDispatch);
	}
	return E_NOTIMPL;
//	IDispatch* pDisp = (IDispatch*)theApp.m_pDispOM;
//	pDisp->AddRef();
//	*ppDispatch = pDisp;
  //  return S_OK;
}
        
STDMETHODIMP CCustomControlSite::XDocHostUIHandler2::TranslateUrl( 
            /* [in] */ DWORD dwTranslate,
            /* [in] */ OLECHAR __RPC_FAR *pchURLIn,
            /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->TranslateUrl( 
            /* [in] */ dwTranslate,
            /* [in] */ pchURLIn,
            /* [out] */ ppchURLOut);
	}
	return E_NOTIMPL;

}
        
STDMETHODIMP CCustomControlSite::XDocHostUIHandler2::FilterDataObject( 
            /* [in] */ IDataObject __RPC_FAR *pDO,
            /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)
{
	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->FilterDataObject( 
            /* [in] */ pDO,
            /* [out] */ ppDORet);
	}
	return E_NOTIMPL;
}

HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler2::GetOverrideKeyPath(BSTR* pbstrKey, DWORD	dw)
{

	METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler2)
	if(pThis->m_pCustomImpl){
		return pThis->m_pCustomImpl->GetOverrideKeyPath(pbstrKey, dw);
	}
	return E_NOTIMPL;
}


///////////////////////////////////////////////////////////////////////////// 
// CCustomControlSite: IAthenticate::IUnknown methods

ULONG CCustomControlSite::XAuthenticate::AddRef()
{
	METHOD_PROLOGUE(CCustomControlSite, Authenticate)
	return pThis->ExternalAddRef();
}

ULONG CCustomControlSite::XAuthenticate::Release()
{                            
	METHOD_PROLOGUE(CCustomControlSite, Authenticate)
	return pThis->ExternalRelease();
}

HRESULT CCustomControlSite::XAuthenticate::QueryInterface(REFIID riid, void **ppvObj)
{
	METHOD_PROLOGUE(CCustomControlSite, Authenticate)
	HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
	return hr;
}


///////////////////////////////////////////////////////////////////////////// 
// CCustomControlSite: Authenticate methods
//prompt for username and password
STDMETHODIMP CCustomControlSite::XAuthenticate::Authenticate( 
    HWND __RPC_FAR *phwnd,
    LPWSTR __RPC_FAR *pszUsername,
    LPWSTR __RPC_FAR *pszPassword)
{
	METHOD_PROLOGUE(CCustomControlSite, Authenticate)
	CDlgAuthenticate	DlgAuthenticate;
	DlgAuthenticate.m_strUserName=theApp.m_strAuthenticateUsername;
	DlgAuthenticate.m_strPassword=theApp.m_strAuthenticatePassword;
	if(DlgAuthenticate.DoModal()==IDOK){
		theApp.m_strAuthenticateUsername=DlgAuthenticate.m_strUserName;
		theApp.m_strAuthenticatePassword=DlgAuthenticate.m_strPassword;
		WCHAR *wszDlgUser = (WCHAR *) CoTaskMemAlloc(255 * sizeof(WCHAR));
		WCHAR *wszDlgPassword = (WCHAR *) CoTaskMemAlloc(255 * sizeof(WCHAR));
		MultiByteToWideChar(GetACP(), 0, (const char*)theApp.m_strAuthenticateUsername, -1, wszDlgUser, 255);
		MultiByteToWideChar(GetACP(), 0, (const char*)theApp.m_strAuthenticatePassword, -1, wszDlgPassword, 255);
		*pszUsername = wszDlgUser;
		*pszPassword = wszDlgPassword;
		*phwnd = NULL;
		return S_OK;
	}
	return E_NOINTERFACE;
}

// 
// IServiceProvider
// 

ULONG CCustomControlSite::XServiceProvider::AddRef()
{
	METHOD_PROLOGUE(CCustomControlSite, ServiceProvider)
	return pThis->ExternalAddRef();
}

ULONG CCustomControlSite::XServiceProvider::Release()
{                            
	METHOD_PROLOGUE(CCustomControlSite, ServiceProvider)
	return pThis->ExternalRelease();
}

HRESULT CCustomControlSite::XServiceProvider::QueryInterface(REFIID riid, void **ppvObj)
{
	METHOD_PROLOGUE(CCustomControlSite, ServiceProvider)
	HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
	return hr;
}

STDMETHODIMP CCustomControlSite::XServiceProvider::QueryService(REFGUID sid, REFIID iid, LPVOID * ppv)
{
 	METHOD_PROLOGUE(CCustomControlSite, ServiceProvider)

	if (sid == IID_IAuthenticate || iid == IID_IAuthenticate) {
		return (HRESULT)pThis->ExternalQueryInterface(&iid, ppv);
    } else {
		*ppv = NULL;
	}
		
	return E_NOINTERFACE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -