BOOL CFontPropPage::GetFontProps(CDataExchange* /* pDX */, FONTOBJECT* pfobj, LPCTSTR pszPropName, MERGEOBJECT* pmobj) { USES_CONVERSION; BOOL bStatus = FALSE; COleDispatchDriver PropDispDriver; ULONG nObjects; LPDISPATCH* ppDisp = GetObjectArray(&nObjects); for (ULONG i = 0; i < nObjects; i++) { DISPID dwDispID; // Get the Dispatch ID for the property and if successful get the value LPCOLESTR lpOleStr = T2COLE(pszPropName); if (SUCCEEDED(ppDisp[i]->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpOleStr, 1, m_lcid, &dwDispID))) { LPDISPATCH pFontDisp; // Get property PropDispDriver.AttachDispatch(ppDisp[i], FALSE); PropDispDriver.GetProperty(dwDispID, VT_DISPATCH, &pFontDisp); PropDispDriver.DetachDispatch(); if (pFontDisp == NULL) continue; // Get font interface IFont * pFont; HRESULT hresult = pFontDisp->QueryInterface(IID_IFont, (void**)&pFont); if (hresult == S_OK) { BOOL bTemp; // Set font characteristics OLECHAR *pszName; pFont->get_Name(&pszName); if (lstrcmp(OLE2CT(pszName), pfobj->strName) != 0 && i != 0) pmobj->bNameOK = FALSE; pfobj->strName = pszName; SysFreeString(pszName); CY cyTemp; pFont->get_Size(&cyTemp); if ((cyTemp.Lo != pfobj->cySize.Lo || cyTemp.Hi != pfobj->cySize.Hi) && i != 0) pmobj->bSizeOK = FALSE; pfobj->cySize = cyTemp; pFont->get_Bold(&bTemp); if (pfobj->bBold != bTemp && i != 0) pmobj->bStyleOK = FALSE; pfobj->bBold = bTemp; pFont->get_Italic(&bTemp); if (pfobj->bItalic != bTemp && i != 0) pmobj->bStyleOK = FALSE; pfobj->bItalic = bTemp; pFont->get_Underline(&bTemp); if (pfobj->bUnderline != bTemp && i != 0) pmobj->bUnderlineOK = FALSE; pfobj->bUnderline = bTemp; pFont->get_Strikethrough(&bTemp); if (pfobj->bStrikethrough != bTemp && i != 0) pmobj->bStrikethroughOK = FALSE; pfobj->bStrikethrough = bTemp; short sTemp; pFont->get_Weight(&sTemp); if (pfobj->sWeight != sTemp && i != 0) pmobj->bStyleOK = FALSE; pfobj->sWeight = sTemp; // Release the font interface RELEASE(pFont); bStatus = TRUE; } // Release font interface RELEASE(pFontDisp); } } return bStatus; }