| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 | 
							- // This is a part of the Microsoft Foundation Classes C++ library.
 
- // Copyright (C) 1992-1998 Microsoft Corporation
 
- // All rights reserved.
 
- //
 
- // This source code is only intended as a supplement to the
 
- // Microsoft Foundation Classes Reference and related
 
- // electronic documentation provided with the library.
 
- // See these sources for detailed information regarding the
 
- // Microsoft Foundation Classes product.
 
- #include "stdafx.h"
 
- #ifdef AFXCTL_OLE_SEG
 
- #pragma code_seg(AFXCTL_OLE_SEG)
 
- #endif
 
- #ifdef _DEBUG
 
- #undef THIS_FILE
 
- static char THIS_FILE[] = __FILE__;
 
- #endif
 
- #define new DEBUG_NEW
 
- #ifndef _AFX_NO_OLE_SUPPORT
 
- /////////////////////////////////////////////////////////////////////////////
 
- // Signature for verb functions
 
- typedef BOOL (AFX_MSG_CALL CCmdTarget::*AFX_PVERBFN)(LPMSG, HWND, LPCRECT);
 
- /////////////////////////////////////////////////////////////////////////////
 
- // CEnumOleVerb - enumerator for OLEVERB
 
- class CEnumOleVerb : public CEnumArray
 
- {
 
- public:
 
- 	CEnumOleVerb(const void* pvEnum, UINT nSize) :
 
- 		CEnumArray(sizeof(OLEVERB), pvEnum, nSize, TRUE) {}
 
- 	~CEnumOleVerb();
 
- protected:
 
- 	virtual BOOL OnNext(void* pv);
 
- 	DECLARE_INTERFACE_MAP()
 
- };
 
- BEGIN_INTERFACE_MAP(CEnumOleVerb, CEnumArray)
 
- 	INTERFACE_PART(CEnumOleVerb, IID_IEnumOLEVERB, EnumVOID)
 
- END_INTERFACE_MAP()
 
- CEnumOleVerb::~CEnumOleVerb()
 
- {
 
- 	if (m_pClonedFrom == NULL)
 
- 	{
 
- 		UINT iVerb;
 
- 		LPOLEVERB lpVerb = (LPOLEVERB)(void*)m_pvEnum;
 
- 		for (iVerb = 0; iVerb < m_nSize; iVerb++)
 
- 			CoTaskMemFree(lpVerb[iVerb].lpszVerbName);
 
- 	}
 
- 	// destructor will free the actual array (if it was not a clone)
 
- }
 
- BOOL CEnumOleVerb::OnNext(void* pv)
 
- {
 
- 	if (!CEnumArray::OnNext(pv))
 
- 		return FALSE;
 
- 	// outgoing OLEVERB requires the verb name to be copied
 
- 	//  (the caller has responsibility to free it)
 
- 	LPOLEVERB lpVerb = (LPOLEVERB)pv;
 
- 	if (lpVerb->lpszVerbName != NULL)
 
- 	{
 
- 		lpVerb->lpszVerbName = AfxAllocTaskOleString(lpVerb->lpszVerbName);
 
- 		if (lpVerb->lpszVerbName == NULL)
 
- 			AfxThrowMemoryException();
 
- 	}
 
- 	// otherwise, copying worked...
 
- 	return TRUE;
 
- }
 
- /////////////////////////////////////////////////////////////////////////////
 
- // CCmdTarget::EnumOleVerbs - implementation for IOleObject::EnumVerbs
 
- BOOL CCmdTarget::EnumOleVerbs(LPENUMOLEVERB* ppenumOleVerb)
 
- {
 
- 	LPOLEVERB lpVerbList = NULL;
 
- 	LPOLEVERB lpVerbListNew;
 
- 	LPOLEVERB lpVerb;
 
- 	long nVerbs = 0;
 
- 	long nAlloc = 0;
 
- 	CString strVerbName;
 
- 	// walk the chain of message maps
 
- 	const AFX_MSGMAP* pMessageMap;
 
- 	const AFX_MSGMAP_ENTRY* lpEntry;
 
- 	for (pMessageMap = GetMessageMap();
 
- 		 (pMessageMap != NULL);
 
- #ifdef _AFXDLL
 
- 		 pMessageMap = pMessageMap->pfnGetBaseMap())
 
- #else
 
- 		 pMessageMap = pMessageMap->pBaseMap)
 
- #endif
 
- 	{
 
- 		// find all verb entries in the map that have non-negative IDs
 
- 		lpEntry = pMessageMap->lpEntries;
 
- 		while ((lpEntry = AfxFindMessageEntry(lpEntry, 0xC002, 0, 1)) != NULL)
 
- 		{
 
- 			ASSERT(lpEntry != NULL);
 
- 			if (nVerbs == nAlloc)
 
- 			{
 
- 				// not enough space for new item -- allocate more
 
- 				lpVerbListNew = new OLEVERB[nVerbs + 10];
 
- 				nAlloc += 10;
 
- 				memcpy(lpVerbListNew, lpVerbList, (size_t)(nVerbs *
 
- 					sizeof(OLEVERB)));
 
- 				delete [] lpVerbList;
 
- 				lpVerbList = lpVerbListNew;
 
- 			}
 
- 			// get the string for this item
 
- 			if (!strVerbName.LoadString(lpEntry->nSig))
 
- 				strVerbName = _T("<unknown verb>");     // LoadString failed
 
- 			ASSERT(strVerbName.GetLength() > 0);
 
- 			// add this item to the list
 
- 			ASSERT(nVerbs < nAlloc);
 
- 			lpVerb = &lpVerbList[nVerbs];
 
- 			lpVerb->lVerb = nVerbs;
 
- 			lpVerb->lpszVerbName = AfxAllocTaskOleString(strVerbName);
 
- 			lpVerb->fuFlags = 0;
 
- 			lpVerb->grfAttribs = OLEVERBATTRIB_ONCONTAINERMENU;
 
- 			++nVerbs;
 
- 			++lpEntry;
 
- 		}
 
- 	}
 
- 	if (nVerbs > 0)
 
- 	{
 
- 		// create and return the IEnumOLEVERB object
 
- 		CEnumOleVerb* pEnum = new CEnumOleVerb(lpVerbList, (UINT)nVerbs);
 
- 		*ppenumOleVerb = (IEnumOLEVERB*)&pEnum->m_xEnumVOID;
 
- 	}
 
- 	else
 
- 	{
 
- 		// no verbs: return NULL
 
- 		*ppenumOleVerb = NULL;
 
- 	}
 
- 	return (nVerbs > 0);
 
- }
 
- /////////////////////////////////////////////////////////////////////////////
 
- // CCmdTarget::DoOleVerb - implementation for IOleObject::DoVerb
 
- BOOL CCmdTarget::DoOleVerb(LONG iVerb, LPMSG lpMsg, HWND hWndParent,
 
- 	LPCRECT lpRect)
 
- {
 
- 	const AFX_MSGMAP* pMessageMap;
 
- 	const AFX_MSGMAP_ENTRY* lpEntry = NULL;
 
- 	long i = -1;
 
- 	for (pMessageMap = GetMessageMap();
 
- 		 (pMessageMap != NULL) && (lpEntry == NULL);
 
- #ifdef _AFXDLL
 
- 		 pMessageMap = pMessageMap->pfnGetBaseMap())
 
- #else
 
- 		 pMessageMap = pMessageMap->pBaseMap)
 
- #endif
 
- 	{
 
- 		if (iVerb < 0)  // Standard verb (negative index)
 
- 		{
 
- 			lpEntry = AfxFindMessageEntry(pMessageMap->lpEntries, 0xC002, 0,
 
- 				(UINT)iVerb);
 
- 		}
 
- 		else            // Non-standard verb (non-negative index)
 
- 		{
 
- 			lpEntry = pMessageMap->lpEntries;
 
- 			while (((lpEntry = AfxFindMessageEntry(lpEntry, 0xC002, 0, 1)) !=
 
- 					NULL) && (++i < iVerb))
 
- 			{
 
- 				++lpEntry;
 
- 			}
 
- 			ASSERT((lpEntry == NULL) || (i == iVerb));
 
- 		}
 
- 	}
 
- 	if (lpEntry == NULL)
 
- 		return FALSE;
 
- 	AFX_PVERBFN pfn = (AFX_PVERBFN)(lpEntry->pfn);
 
- 	if (!(this->*pfn)(lpMsg, hWndParent, lpRect))
 
- 		THROW (new CException);
 
- 	return TRUE;
 
- }
 
- #endif //!_AFX_NO_OLE_SUPPORT
 
- /////////////////////////////////////////////////////////////////////////////
 
- // Force any extra compiler-generated code into AFX_INIT_SEG
 
- #ifdef AFX_INIT_SEG
 
- #pragma code_seg(AFX_INIT_SEG)
 
- #endif
 
 
  |