📄 idispimp.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 + -