void COleControl::InitStockPropMask() { const AFX_DISPMAP* pDispMap = GetDispatchMap(); const AFX_DISPMAP_ENTRY* pEntry; ASSERT(pDispMap != NULL); // If stock property mask is already initialized, we're outta here. if (*pDispMap->lpStockPropMask != (DWORD)-1) return; AfxLockGlobals(CRIT_STOCKMASK); if (*pDispMap->lpStockPropMask == (DWORD)-1) { const AFX_DISPMAP* pDispMapTop = pDispMap; DWORD dwStockPropMask = 0; #ifdef _AFXDLL for (;;) #else while (pDispMap != NULL) #endif { pEntry = pDispMap->lpEntries; while (pEntry->nPropOffset != -1) { int nIndex = DISPID_BACKCOLOR - pEntry->lDispID; DWORD dwFlag; if (nIndex >= 0 && nIndex < _countof(_afxStockProps) && (dwFlag = _afxStockProps[nIndex]) != 0) { dwStockPropMask |= dwFlag; } ++pEntry; } // check base class #ifdef _AFXDLL if (pDispMap->pfnGetBaseMap == NULL) break; pDispMap = (*pDispMap->pfnGetBaseMap)(); #else pDispMap = pDispMap->pBaseMap; #endif } *pDispMapTop->lpStockPropMask = dwStockPropMask; } AfxUnlockGlobals(CRIT_STOCKMASK); }
// enable this object for OLE automation, called from derived class ctor void CCmdTarget::EnableAutomation() { ASSERT(GetDispatchMap() != NULL); // must have DECLARE_DISPATCH_MAP // construct an COleDispatchImpl instance just to get to the vtable COleDispatchImpl dispatch; // vtable pointer should be already set to same or NULL ASSERT(m_xDispatch.m_vtbl == NULL|| *(DWORD*)&dispatch == m_xDispatch.m_vtbl); // sizeof(COleDispatchImpl) should be just a DWORD (vtable pointer) ASSERT(sizeof(m_xDispatch) == sizeof(COleDispatchImpl)); // copy the vtable (and other data) to make sure it is initialized m_xDispatch.m_vtbl = *(DWORD*)&dispatch; *(COleDispatchImpl*)&m_xDispatch = dispatch; }
const AFX_DISPMAP_ENTRY* PASCAL CCmdTarget::GetDispEntry(MEMBERID memid) { const AFX_DISPMAP* pDerivMap = GetDispatchMap(); const AFX_DISPMAP* pDispMap; const AFX_DISPMAP_ENTRY* pEntry; if (memid == DISPID_VALUE) { // DISPID_VALUE is a special alias (look for special alias entry) pDispMap = pDerivMap; while (pDispMap != NULL) { // search for special entry with vt == VT_MFCVALUE pEntry = pDispMap->lpEntries; while (pEntry->nPropOffset != -1) { if (pEntry->vt == VT_MFCVALUE) { memid = pEntry->lDispID; if (memid == DISPID_UNKNOWN) { // attempt to map alias name to member ID memid = MemberIDFromName(pDerivMap, pEntry->lpszName); if (memid == DISPID_UNKNOWN) return NULL; } // break out and map the member ID to an entry goto LookupDispID; } ++pEntry; } #ifdef _AFXDLL pDispMap = (*pDispMap->pfnGetBaseMap)(); #else pDispMap = pDispMap->pBaseMap; #endif } } LookupDispID: if ((long)memid > 0) { // find AFX_DISPMAP corresponding to HIWORD(memid) UINT nTest = 0; pDispMap = pDerivMap; while (pDispMap != NULL && nTest < (UINT)HIWORD(memid)) { #ifdef _AFXDLL pDispMap = (*pDispMap->pfnGetBaseMap)(); #else pDispMap = pDispMap->pBaseMap; #endif ++nTest; } if (pDispMap != NULL) { UINT nEntryCount = GetEntryCount(pDispMap); if ((UINT)LOWORD(memid) <= nEntryCount) { pEntry = pDispMap->lpEntries + LOWORD(memid)-1; // must have automatic DISPID or same ID // if not then look manually if (pEntry->lDispID == DISPID_UNKNOWN || pEntry->lDispID == memid) { return pEntry; } } } } // second pass, look for DISP_XXX_ID entries pDispMap = pDerivMap; while (pDispMap != NULL) { // find AFX_DISPMAP_ENTRY where (pEntry->lDispID == memid) pEntry = pDispMap->lpEntries; while (pEntry->nPropOffset != -1) { if (pEntry->lDispID == memid) return pEntry; ++pEntry; } // check base class #ifdef _AFXDLL pDispMap = (*pDispMap->pfnGetBaseMap)(); #else pDispMap = pDispMap->pBaseMap; #endif } return NULL; // no matching entry }
void COleControl::InitStockPropMask() { static const DWORD _dwStockFlags[] = { STOCKPROP_BACKCOLOR, // -501 0, // -502 0, // -503 STOCKPROP_BORDERSTYLE, // -504 0, // -505 0, // -506 0, // -507 0, // -508 0, // -509 0, // -510 0, // -511 STOCKPROP_FONT, // -512 STOCKPROP_FORECOLOR, // -513 STOCKPROP_ENABLED, // -514 0, // -515 0, // -516 STOCKPROP_TEXT, // -517 STOCKPROP_CAPTION, // -518 0, // -519 STOCKPROP_APPEARANCE, // -520 }; const AFX_DISPMAP* pDispMap = GetDispatchMap(); const AFX_DISPMAP_ENTRY* pEntry; ASSERT(pDispMap != NULL); // If stock property mask is already initialized, we're outta here. if (*pDispMap->lpStockPropMask != (DWORD)-1) return; AfxLockGlobals(CRIT_STOCKMASK); if (*pDispMap->lpStockPropMask == (DWORD)-1) { const AFX_DISPMAP* pDispMapTop = pDispMap; DWORD dwStockPropMask = 0; while (pDispMap != NULL) { pEntry = pDispMap->lpEntries; while (pEntry->nPropOffset != -1) { int nIndex = DISPID_BACKCOLOR - pEntry->lDispID; DWORD dwFlag; if (nIndex >= 0 && nIndex < _countof(_dwStockFlags) && (dwFlag = _dwStockFlags[nIndex]) != 0) { dwStockPropMask |= dwFlag; } ++pEntry; } // check base class #ifdef _AFXDLL pDispMap = (*pDispMap->pfnGetBaseMap)(); #else pDispMap = pDispMap->pBaseMap; #endif } *pDispMapTop->lpStockPropMask = dwStockPropMask; } AfxUnlockGlobals(CRIT_STOCKMASK); }