void CBasePropertySheet::BuildPropPageArray() { // delete existing prop page array free((void*)m_psh.ppsp); m_psh.ppsp = NULL; // determine size of PROPSHEETPAGE array int i; int nBytes = 0; for (i = 0; i < m_pages.GetSize(); i++) { CPropertyPage* pPage = GetPage(i); nBytes += pPage->m_psp.dwSize; } // build new PROPSHEETPAGE array PROPSHEETPAGE* ppsp = (PROPSHEETPAGE*)malloc(nBytes); BYTE* ppspOrigByte=reinterpret_cast<BYTE*>(ppsp); if (ppsp == NULL) AfxThrowMemoryException(); BYTE* pPropSheetPagesArrEnd=ppspOrigByte + nBytes; ENSURE(pPropSheetPagesArrEnd >= ppspOrigByte); m_psh.ppsp = ppsp; BOOL bWizard = (m_psh.dwFlags & (PSH_WIZARD | PSH_WIZARD97)); for (i = 0; i < m_pages.GetSize(); i++) { CPropertyPage* pPage = GetPage(i); BYTE* ppspByte=reinterpret_cast<BYTE*>(ppsp); ENSURE_THROW(ppspByte >= ppspOrigByte && ppspByte <= pPropSheetPagesArrEnd,AfxThrowMemoryException()); Checked::memcpy_s(ppsp, pPropSheetPagesArrEnd - reinterpret_cast<BYTE*>(ppsp), &pPage->m_psp, pPage->m_psp.dwSize); if (!((_CCPropertyPage*)pPage)->m_strHeaderTitle.IsEmpty()) { ppsp->pszHeaderTitle = ((_CCPropertyPage*)pPage)->m_strHeaderTitle; ppsp->dwFlags |= PSP_USEHEADERTITLE; } if (!((_CCPropertyPage*)pPage)->m_strHeaderSubTitle.IsEmpty()) { ppsp->pszHeaderSubTitle = ((_CCPropertyPage*)pPage)->m_strHeaderSubTitle; ppsp->dwFlags |= PSP_USEHEADERSUBTITLE; } // pPage->PreProcessPageTemplate(*ppsp, bWizard); CPropertyPage_PreProcessPageTemplate((_CCPropertyPage*)pPage, *ppsp, bWizard); (BYTE*&)ppsp += ppsp->dwSize; } m_psh.nPages = (int)m_pages.GetSize(); }
void CToolTipCtrl::GetText(CString& str, CWnd* pWnd, UINT_PTR nIDTool) const { ASSERT(::IsWindow(m_hWnd)); ASSERT(pWnd != NULL); TOOLINFO ti; FillInToolInfo(ti, pWnd, nIDTool); //Dogtag to detect buffer overruns in TTM_GETTEXT (Cannot query for text len). const TCHAR _OverrunDetector[] = _T("M\0FC"); ti.lpszText = str.GetBuffer(MAX_TIP_TEXT_LENGTH + _countof(_OverrunDetector) ); memset(ti.lpszText,0,MAX_TIP_TEXT_LENGTH*sizeof(TCHAR)); Checked::memcpy_s(ti.lpszText + MAX_TIP_TEXT_LENGTH, sizeof(_OverrunDetector), _OverrunDetector,sizeof(_OverrunDetector)); ::SendMessage(m_hWnd, TTM_GETTEXT, 0, (LPARAM)&ti); ENSURE_THROW(memcmp(_OverrunDetector,ti.lpszText + MAX_TIP_TEXT_LENGTH,sizeof(_OverrunDetector)) == 0,::AfxThrowMemoryException()); str.ReleaseBuffer(); }
static void AFXAPI TraceDDE(LPCTSTR lpszPrefix, const MSG* pMsg) { ENSURE_ARG(pMsg != NULL); if (pMsg->message == WM_DDE_EXECUTE) { UINT_PTR nDummy; HGLOBAL hCommands; if (!UnpackDDElParam(WM_DDE_EXECUTE, pMsg->lParam, &nDummy, (UINT_PTR*)&hCommands)) { TRACE(traceAppMsg, 0, "Warning: Unable to unpack WM_DDE_EXECUTE lParam %08lX.\n", pMsg->lParam); return; } ASSERT(hCommands != NULL); LPCTSTR lpszCommands = (LPCTSTR)::GlobalLock(hCommands); ENSURE_THROW(lpszCommands != NULL, ::AfxThrowMemoryException() ); TRACE(traceAppMsg, 0, _T("%s: Execute '%s'.\n"), lpszPrefix, lpszCommands); ::GlobalUnlock(hCommands); } else if (pMsg->message == WM_DDE_ADVISE) { UINT_PTR nItem; ATOM aItem; HGLOBAL hAdvise; if (!UnpackDDElParam(WM_DDE_ADVISE, pMsg->lParam, (UINT_PTR*)&hAdvise, &nItem)) { TRACE(traceAppMsg, 0, "Warning: Unable to unpack WM_DDE_ADVISE lParam %08lX.\n", pMsg->lParam); return; } aItem = (ATOM)nItem; ASSERT(aItem != NULL); ASSERT(hAdvise != NULL); DDEADVISE* lpAdvise = (DDEADVISE*)::GlobalLock(hAdvise); ENSURE_THROW(lpAdvise != NULL, ::AfxThrowMemoryException() ); TCHAR szItem[80]; szItem[0] = '\0'; if (aItem != 0) ::GlobalGetAtomName(aItem, szItem, _countof(szItem)); TCHAR szFormat[80]; szFormat[0] = '\0'; if (((UINT)0xC000 <= (UINT)lpAdvise->cfFormat) && ((UINT)lpAdvise->cfFormat <= (UINT)0xFFFF)) { ::GetClipboardFormatName(lpAdvise->cfFormat, szFormat, _countof(szFormat)); // User defined clipboard formats have a range of 0xC000->0xFFFF // System clipboard formats have other ranges, but no printable // format names. } AfxTrace( _T("%s: Advise item='%s', Format='%s', Ack=%d, Defer Update= %d\n"), lpszPrefix, szItem, szFormat, lpAdvise->fAckReq, lpAdvise->fDeferUpd); ::GlobalUnlock(hAdvise); } }