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

📄 idispimp.cpp

📁 这个程序主要是利用MFC编译的一个可以定制浏览器窗口的程序
💻 CPP
字号:
/*
 * idispimp.CPP
 * IDispatch for Extending Dynamic HTML Object Model
 *
 * Copyright (c)1995-1999 Microsoft Corporation, All Rights Reserved
 */ 

#include "stdafx.h"
#include "idispimp.h"

#include "InternetEx.h"
#include "MainFrm.h"
#include "InternetExDoc.h"
#include "InternetExView.h"


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

//[ 定制浏览器功能添加代码
CString cszCB_IsOurCustomBrowser = "CB_IsOurCustomBrowser";
CString cszCB_CustomFunction = "CB_CustomFunction";
CString cszCB_CustomFunctionWithParams = "CB_CustomFunctionWithParams";
CString cszCB_OpenWindow = "CB_OpenWindow";
CString cszCB_ShowModalDialog = "CB_ShowModalDialog";
CString cszCB_ShowModelessDialog = "CB_ShowModelessDialog";

#define DISPID_CB_IsOurCustomBrowser       1
#define DISPID_CB_CustomFunction           2
#define DISPID_CB_CustomFunctionWithParams 3
#define DISPID_CB_OpenWindow               4
#define DISPID_CB_ShowModalDialog          5
#define DISPID_CB_ShowModelessDialog       6
// 定制浏览器功能添加代码 ]


/*
 * CImpIDispatch::CImpIDispatch
 * CImpIDispatch::~CImpIDispatch
 *
 * Parameters (Constructor):
 *  pSite           PCSite of the site we're in.
 *  pUnkOuter       LPUNKNOWN to which we delegate.
 */ 

CImpIDispatch::CImpIDispatch( void )
{
    m_cRef = 0;
}

CImpIDispatch::~CImpIDispatch( void )
{
	ASSERT( m_cRef == 0 );
}


/*
 * CImpIDispatch::QueryInterface
 * CImpIDispatch::AddRef
 * CImpIDispatch::Release
 *
 * Purpose:
 *  IUnknown members for CImpIDispatch object.
 */ 

STDMETHODIMP CImpIDispatch::QueryInterface( REFIID riid, void **ppv )
{
    *ppv = NULL;


    if ( IID_IDispatch == riid )
	{
        *ppv = this;
	}
	
	if ( NULL != *ppv )
    {
        ((LPUNKNOWN)*ppv)->AddRef();
        return NOERROR;
    }

	return E_NOINTERFACE;
}


STDMETHODIMP_(ULONG) CImpIDispatch::AddRef(void)
{
    return ++m_cRef;
}

STDMETHODIMP_(ULONG) CImpIDispatch::Release(void)
{
    return --m_cRef;
}


//IDispatch
STDMETHODIMP CImpIDispatch::GetTypeInfoCount(UINT* /*pctinfo*/)
{
	return E_NOTIMPL;
}

STDMETHODIMP CImpIDispatch::GetTypeInfo(
			/* [in] */ UINT /*iTInfo*/,
            /* [in] */ LCID /*lcid*/,
            /* [out] */ ITypeInfo** /*ppTInfo*/)
{
	return E_NOTIMPL;
}

STDMETHODIMP CImpIDispatch::GetIDsOfNames(
			/* [in] */ REFIID riid,
            /* [size_is][in] */ OLECHAR** rgszNames,
            /* [in] */ UINT cNames,
            /* [in] */ LCID lcid,
            /* [size_is][out] */ DISPID* rgDispId)
{
	HRESULT hr;
	UINT	i;

	// Assume some degree of success
	hr = NOERROR;

	for ( i=0; i < cNames; i++) 
	{
		CString cszName  = rgszNames[i];

		if(cszName == cszCB_IsOurCustomBrowser)
		{
			rgDispId[i] = DISPID_CB_IsOurCustomBrowser;
		}
		else if(cszName == cszCB_CustomFunction)
		{
			rgDispId[i] = DISPID_CB_CustomFunction;
		}
		else if(cszName == cszCB_CustomFunctionWithParams)
		{
			rgDispId[i] = DISPID_CB_CustomFunctionWithParams;
		}	
		else if(cszName == cszCB_OpenWindow)
		{
			rgDispId[i] = DISPID_CB_OpenWindow;
		}
		else if(cszName == cszCB_ShowModalDialog)
		{
			rgDispId[i] = DISPID_CB_ShowModalDialog;
		}
		else if(cszName == cszCB_ShowModelessDialog)
		{
			rgDispId[i] = DISPID_CB_ShowModelessDialog;
		}
		else {
			// One or more are unknown so set the return code accordingly
			hr = ResultFromScode(DISP_E_UNKNOWNNAME);
			rgDispId[i] = DISPID_UNKNOWN;
		}
	}
	return hr;
}

STDMETHODIMP CImpIDispatch::Invoke(
            /* [in] */ DISPID dispIdMember,
            /* [in] */ REFIID /*riid*/,
            /* [in] */ LCID /*lcid*/,
            /* [in] */ WORD wFlags,
            /* [out][in] */ DISPPARAMS* pDispParams,
            /* [out] */ VARIANT* pVarResult,
            /* [out] */ EXCEPINFO* /*pExcepInfo*/,
            /* [out] */ UINT* puArgErr)
{

	CMainFrame* pMainFrm = (CMainFrame*) AfxGetMainWnd();
	
	if(dispIdMember == DISPID_CB_IsOurCustomBrowser) 
	{
		if(wFlags & DISPATCH_PROPERTYGET)
		{
			if(pVarResult != NULL)
			{
				VariantInit(pVarResult);
				V_VT(pVarResult)=VT_BOOL;
				V_BOOL(pVarResult) = true;
			}
		}
		
		if ( wFlags & DISPATCH_METHOD )
		{
			bool bResult = (bool)(pMainFrm->CB_IsOurCustomBrowser());
			
			VariantInit(pVarResult);
			V_VT(pVarResult)=VT_BOOL;
			V_BOOL(pVarResult) = bResult;
		}
		
	}
	
	if(dispIdMember == DISPID_CB_CustomFunction) 
	{
		if(wFlags & DISPATCH_PROPERTYGET)
		{
			if(pVarResult != NULL)
			{
				VariantInit(pVarResult);
				V_VT(pVarResult)=VT_BOOL;
				V_BOOL(pVarResult) = true;
			}
		}
		
		if ( wFlags & DISPATCH_METHOD )
		{
			pMainFrm->CB_CustomFunction();
		}
        
		
	}
	
	if(dispIdMember == DISPID_CB_CustomFunctionWithParams) 
	{
		if(wFlags & DISPATCH_PROPERTYGET)
		{
			if(pVarResult != NULL)
			{
				
				VariantInit(pVarResult);
				V_VT(pVarResult)=VT_BOOL;
				V_BOOL(pVarResult) = true;
			}
		}
		
		if ( wFlags & DISPATCH_METHOD )
		{
			//参数传递进来的顺序和网页调用时的顺序正好相反
			CString cszArg1= pDispParams->rgvarg[1].bstrVal; // in case you want a CString copy
			int nArg2= pDispParams->rgvarg[0].intVal;
			
			pMainFrm->CB_CustomFunctionWithParams(cszArg1, nArg2);
		}
		
	}

	if(dispIdMember == DISPID_CB_OpenWindow) 
	{
		if(wFlags & DISPATCH_PROPERTYGET)
		{
			if(pVarResult != NULL)
			{
				
				VariantInit(pVarResult);
				V_VT(pVarResult)=VT_BOOL;
				V_BOOL(pVarResult) = true;
			}
		}
		
		if ( wFlags & DISPATCH_METHOD )
		{
			//arguments come in reverse order
			//for some reason
			CString cszArg1= pDispParams->rgvarg[5].bstrVal; // in case you want a CString copy
			int nArg2= pDispParams->rgvarg[4].intVal;
			int nArg3= pDispParams->rgvarg[3].intVal;
			int nArg4= pDispParams->rgvarg[2].intVal;
			int nArg5= pDispParams->rgvarg[1].intVal;
			int nArg6 = pDispParams->rgvarg[0].intVal;
			
			pMainFrm->CB_OpenWindow(cszArg1, nArg2, nArg3, nArg4, nArg5, nArg6);
		}
		
	}
	
	if(dispIdMember == DISPID_CB_ShowModelessDialog) 
	{
		if(wFlags & DISPATCH_PROPERTYGET)
		{
			if(pVarResult != NULL)
			{
				
				VariantInit(pVarResult);
				V_VT(pVarResult)=VT_BOOL;
				V_BOOL(pVarResult) = true;
			}
		}
		
		if ( wFlags & DISPATCH_METHOD )
		{
			//arguments come in reverse order
			//for some reason
			CString cszArg1= pDispParams->rgvarg[4].bstrVal; // in case you want a CString copy
			int nArg2= pDispParams->rgvarg[3].intVal;
			int nArg3= pDispParams->rgvarg[2].intVal;
			int nArg4= pDispParams->rgvarg[1].intVal;
			int nArg5= pDispParams->rgvarg[0].intVal;
			
			pMainFrm->CB_ShowModelessDialog(cszArg1, nArg2, nArg3, nArg4, nArg5);
		}
		
	}
	
	if(dispIdMember == DISPID_CB_ShowModalDialog) 
	{
		if(wFlags & DISPATCH_PROPERTYGET)
		{
			if(pVarResult != NULL)
			{
				
				VariantInit(pVarResult);
				V_VT(pVarResult)=VT_BOOL;
				V_BOOL(pVarResult) = true;
			}
		}
		
		if ( wFlags & DISPATCH_METHOD )
		{
			//arguments come in reverse order
			//for some reason
			CString cszArg1= pDispParams->rgvarg[4].bstrVal; // in case you want a CString copy
			int nArg2= pDispParams->rgvarg[3].intVal;
			int nArg3= pDispParams->rgvarg[2].intVal;
			int nArg4= pDispParams->rgvarg[1].intVal;
			int nArg5= pDispParams->rgvarg[0].intVal;
			
			pMainFrm->CB_ShowModalDialog(cszArg1, nArg2, nArg3, nArg4, nArg5);
		}
		
	}

	return S_OK;
}

⌨️ 快捷键说明

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