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

📄 idispimp.cpp

📁 一个多窗口的浏览器的程序benbrowse
💻 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 "benbenbrowser.h"
#include "Mainfrm.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 pszExtend[10]=L"xxyyzz";
#define DISPID_Extend 12345



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

	// 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*)pszExtend, 3, (char*)rgszNames[i], 3 ) )
		{
			rgDispId[i] = DISPID_Extend;
		}
		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)
{

	// For this sample we only support a Property Get on DISPID_Extend
	// returning a BSTR with "Wibble" as the value
	if ( dispIdMember == DISPID_Extend )
	{
		if ( wFlags & DISPATCH_PROPERTYGET )
		{
			if ( pVarResult != NULL )
			{
				WCHAR buff[10]=L"Wibble";
				BSTR bstrRet = SysAllocString( buff );
				VariantInit(pVarResult);
				V_VT(pVarResult)=VT_BSTR;
				V_BSTR(pVarResult) = bstrRet;
			}
		}
	}

	return S_OK;
}
//DropTarget
CImpIDropTarget::CImpIDropTarget( void )
{
    m_cRef = 0;
}

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


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

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

	try{

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

	return E_NOINTERFACE;
}


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

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


STDMETHODIMP CImpIDropTarget::DragEnter(/* [unique][in] */IDataObject __RPC_FAR *pDataObj,
            /* [in] */ DWORD grfKeyState,
            /* [in] */ POINTL pt,
            /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
{
//    if (!pDataObject->IsDataAvailable(CF_TEXT)) 
 //       return DROPEFFECT_NONE;

/*	if(m_hFromWnd==NULL)
	{
		POINT p; p.x = pt.x; p.y = pt.y;
		m_hFromWnd = WindowFromPoint(p);
	}*/
	*pdwEffect = DROPEFFECT_LINK;
   
//    if (dwKeyState & MK_CONTROL)
 //       dwEffect=DROPEFFECT_COPY;
 //   else
 //       dwEffect=DROPEFFECT_MOVE;

    //we set focus to current window such that the caret will be shown
 //   ms_pCtl->SetFocus();

    return S_OK;
}

STDMETHODIMP CImpIDropTarget::DragLeave()
{
//	m_hFromWnd = NULL;
	return S_OK;
}

STDMETHODIMP CImpIDropTarget::DragOver(/* [in] */ DWORD grfKeyState,
            /* [in] */ POINTL pt,
            /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
{

    
		*pdwEffect=DROPEFFECT_LINK;
	

//    if (dwKeyState & MK_CONTROL)
  //      dwEffect=DROPEFFECT_COPY;
 //   else
 //       dwEffect=DROPEFFECT_MOVE;

 //   ms_pCtl->DrawCaretByCursor();

	return S_OK;
}

STDMETHODIMP CImpIDropTarget::Drop(/* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
            /* [in] */ DWORD grfKeyState,
            /* [in] */ POINTL pt,
            /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
{

	try
	{
		HGLOBAL hData = NULL;
		CString str2;
		
		COleDataObject DataObj;
		DataObj.Attach(pDataObj);
		hData = DataObj.GetGlobalData(CF_TEXT);
		DataObj.Detach();
		if (hData)
		{
			LPCSTR lpcszData=(LPCSTR)GlobalLock(hData);
			//	ms_pCtl->SetWindowText(lpcszData);
			//	SendMessage(pMainFrame->GetSafeHwnd(), WM_COMMAND, IDOK, 0);
			str2 = lpcszData;
		}
		else
		{
			//		hData=DataObj.GetGlobalData(CF_HDROP);
			//		if (!hData) {
			TRACE("Fail in getting data\n");
			return E_INVALIDARG;
			//		}
			
			//		HDROP hdrop =(HDROP)GlobalLock(hData);
			
			//		DragQueryFile(hdrop, 0, lpfiles, 1024);
			
			//		str2 = lpfiles;
		}
		
		GlobalUnlock(hData);
		
		//if the protocol is javascript then ignore
		if(str2.Left(11)=="javascript:")
			return S_OK;
		
		
			/*	POINT p; p.x = pt.x; p.y = pt.y;
			if(m_hFromWnd != WindowFromPoint(p))
			{
			
			  m_hFromWnd = NULL;
			  return S_OK;
			  }
		m_hFromWnd = NULL;*/
		
		try{
			
			CMainFrame *pFrame=(CMainFrame *)AfxGetApp()->m_pMainWnd;
			pFrame->NavigateToUrl(str2,0);
//			pFrame->SetAddressComText(str2);
//			::SendMessage(pFrame->m_hWnd,WM_COMMAND,IDOK,0);
			//	CLovelyTreeView* pvw = CreateNewView();
			//	if(pvw!=NULL)
			//	{
			//		pvw->ToNavigate(str2,0,NULL);
			//	}
		}catch(...)
		{
		}
		
	}catch(...)
	{
	}
	
    return S_OK;
}

⌨️ 快捷键说明

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