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

📄 idispimp.cpp

📁 myie2.4版本的源代码
💻 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 "MainFrm.h"
#include "resource.h"       // main symbols
#include "SelProxyCatDlg.h"


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


// Hardcoded information for extending the Object Model 
// Typically this would be supplied through a TypeInfo
// In this case the name "xxyyzz" maps to DISPID_Extend 
const	WCHAR pszAddFavorite[]=L"addFavorite";
const   WCHAR pszAddProxy[]=L"addProxy";
#define DISPID_ADDFAVORITE 20
#define DISPID_ADDPROXY 21



/*
 * 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;

	try{

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

	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;

	try{
	// Hardcoded mapping for this sample
	// A more usual procedure would be to use a TypeInfo
	for ( i=0; i < cNames; i++)
	{
/*		if (  2 == CompareString( lcid, NORM_IGNOREWIDTH, (char*)pszAddFavorite, 22, (char*)rgszNames[i], 22 ) )
		{				AfxMessageBox("dd13");
			rgDispId[i] = DISPID_ADDFAVORITE;
		}
		else if (  2 == CompareString( lcid, NORM_IGNOREWIDTH, (char*)pszAddProxy, 16, (char*)rgszNames[i], 16 ) )
		{				AfxMessageBox("dd11");

			rgDispId[i] = DISPID_ADDPROXY;
		}*/
		if(wcsicmp(pszAddFavorite, rgszNames[i])==0)
		{
			rgDispId[i] = DISPID_ADDFAVORITE;
		}
		else if(wcscmp(pszAddProxy, rgszNames[i])==0)
		{
			rgDispId[i] = DISPID_ADDPROXY;
		}
		else
		{
			// One or more are unknown so set the return code accordingly
			hr = ResultFromScode(DISP_E_UNKNOWNNAME);
			rgDispId[i] = DISPID_UNKNOWN;
		}
	}

	}catch(...)
	{
	}
	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)
{

	if ( pMainFrame!=NULL)
	{
		try
		{
			switch (dispIdMember)
			{
			case DISPID_ADDFAVORITE:
				if(pDispParams->cArgs == 2)
				   ((CMainFrame*)pMainFrame)->AddtoFavorite(pDispParams->rgvarg[1].bstrVal, &pDispParams->rgvarg[0]);
				else if(pDispParams->cArgs == 1)
				   ((CMainFrame*)pMainFrame)->AddtoFavorite(pDispParams->rgvarg[0].bstrVal, &pDispParams->rgvarg[0]);
				break;
			case DISPID_ADDPROXY:
				if(pDispParams->cArgs == 4)
				{
					BOOL webproxy =pDispParams->rgvarg[0].boolVal;
					int speed = pDispParams->rgvarg[1].iVal;
					CString proxy(pDispParams->rgvarg[2].bstrVal);
					CString proxyname(pDispParams->rgvarg[3].bstrVal);
					if(webproxy)
					{
						CProxyList * pl = ((CMainFrame*)pMainFrame)->m_aProxyCategories.GetWebProxyList();
						if(pl!=NULL && pl->Find(proxy)==-1)
						{
							pl->Add(proxy, proxyname, speed);
							AfxMessageBox(IDS_PROXY_ADDED);
						}
					}
					else
					{
						CSelProxyCatDlg dlg;
						dlg.m_bClear = FALSE;
						dlg.m_bDisableClear = TRUE;
						if(dlg.DoModal()==IDOK)
						{
							CProxyList * pl=NULL;
							int i=0;
							for(int l = 0;l <= ((CMainFrame*)pMainFrame)->m_aProxyCategories.m_ProxyCategory.GetUpperBound();l++)
							{
								pl = ((CMainFrame*)pMainFrame)->m_aProxyCategories.m_ProxyCategory.GetAt(l);
								if(!pl->m_bIsWebProxy)
								{
									if(i == dlg.m_SelCates)
										break;
									i++;
								}
							}
							if(pl!=NULL && pl->Find(proxy)==-1)
							{
								pl->Add(proxy, proxyname, speed);
								//((CMainFrame*)pMainFrame)->m_astrProxy.AddTail(proxy);
								//((CMainFrame*)pMainFrame)->m_aProxySpeed.AddTail(speed);
								//((CMainFrame*)pMainFrame)->m_astrProxyName.AddTail(proxyname);
								AfxMessageBox(IDS_PROXY_ADDED);
							}
						}
					}

				}
			}
		}
		catch(...)
		{
		}
	}

	return S_OK;
}

⌨️ 快捷键说明

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