📄 olemisc.cpp
字号:
lpOD->clsid = clsid;
lpOD->dwDrawAspect = dwDrawAspect;
lpOD->sizel = sizel;
lpOD->pointl = pointl;
lpOD->dwStatus = dwStatus;
GlobalUnlock(hMem);
return hMem;
}
HGLOBAL AFXAPI _AfxOleGetObjectDescriptorData(
LPOLEOBJECT lpOleObj,
LPCOLESTR lpszSrcOfCopy,
DWORD dwDrawAspect,
POINTL pointl,
LPSIZEL lpSizelHim)
{
USES_CONVERSION;
CLSID clsid;
LPOLESTR lpszFullUserTypeName = NULL;
LPMONIKER lpSrcMonikerOfCopy = NULL;
HGLOBAL hObjDesc = NULL;
IBindCtx *pbc = NULL;
SCODE sc;
SIZEL sizelHim;
BOOL bFreeSrcOfCopy = FALSE;
LPVIEWOBJECT2 lpViewObj2;
LPOLELINK lpOleLink;
BOOL fIsLink;
TCHAR szLinkedTypeFmt[80];
LPCOLESTR lpszLinkedTypeFmt;
LPOLESTR lpszBuf = NULL;
DWORD dwStatus = 0;
// query for IOleLink
lpOleLink = QUERYINTERFACE(lpOleObj, IOleLink);
fIsLink = lpOleLink != NULL;
// query for IViewObject2
lpViewObj2 = QUERYINTERFACE(lpOleObj, IViewObject2);
// Get CLSID
sc = lpOleObj->GetUserClassID(&clsid);
if (sc != S_OK)
clsid = CLSID_NULL;
// Get FullUserTypeName
sc = lpOleObj->GetUserType(USERCLASSTYPE_FULL, &lpszFullUserTypeName);
// if object is a link, then expand usertypename to be "Linked %s"
if (fIsLink && lpszFullUserTypeName != NULL)
{
// Note: If this LoadString call fails, it is likely that
// _AFX_NO_OLE_RESOURCES is defined in your .RC file.
// To correct the situation remove the following line from your
// resource script:
// #define _AFX_NO_OLE_RESOURCES
// This should be done using the Resource.Set Includes... command.
VERIFY(AfxLoadString(AFX_IDS_PASTELINKEDTYPE, szLinkedTypeFmt));
lpszLinkedTypeFmt = T2COLE(szLinkedTypeFmt);
lpszBuf = (LPOLESTR)CoTaskMemAlloc((ocslen(lpszFullUserTypeName) +
ocslen(lpszLinkedTypeFmt) + 1) * sizeof(OLECHAR));
if (lpszBuf != NULL)
{
#ifdef OLE2ANSI
sprintf(lpszBuf, lpszLinkedTypeFmt, lpszFullUserTypeName);
#else
swprintf(lpszBuf, lpszLinkedTypeFmt, lpszFullUserTypeName);
#endif
CoTaskMemFree(lpszFullUserTypeName);
lpszFullUserTypeName = lpszBuf;
}
}
// get source of copy
if (fIsLink)
{
sc = lpOleLink->GetSourceDisplayName((LPOLESTR*)&lpszSrcOfCopy);
bFreeSrcOfCopy = TRUE;
}
else if (lpszSrcOfCopy == NULL)
{
sc = lpOleObj->GetMoniker(
OLEGETMONIKER_TEMPFORUSER, OLEWHICHMK_OBJFULL, &lpSrcMonikerOfCopy);
if (sc == S_OK)
{
CreateBindCtx(0, &pbc);
lpSrcMonikerOfCopy->GetDisplayName(pbc, NULL,
(LPOLESTR*)&lpszSrcOfCopy);
RELEASE(pbc);
bFreeSrcOfCopy = TRUE;
}
}
if (lpSizelHim)
{
// Use extents passed by the caller
sizelHim = *lpSizelHim;
}
else if (lpViewObj2)
{
// Get the current extents from the object
sc = lpViewObj2->GetExtent(dwDrawAspect, -1, NULL,
(LPSIZEL)&sizelHim);
if (sc != S_OK)
sizelHim.cx = sizelHim.cy = 0;
}
else
{
sizelHim.cx = sizelHim.cy = 0;
}
// Get dwStatus
sc = lpOleObj->GetMiscStatus(dwDrawAspect, &dwStatus);
if (sc != S_OK)
dwStatus = 0;
// Get OBJECTDESCRIPTOR
hObjDesc = _AfxOleGetObjectDescriptorData(clsid, dwDrawAspect, sizelHim,
pointl, dwStatus, lpszFullUserTypeName, lpszSrcOfCopy);
// Clean up
CoTaskMemFree(lpszFullUserTypeName);
if (bFreeSrcOfCopy)
CoTaskMemFree((LPOLESTR)lpszSrcOfCopy);
RELEASE(lpSrcMonikerOfCopy);
RELEASE(lpOleLink);
RELEASE(lpViewObj2);
return hObjDesc;
}
SCODE AFXAPI _AfxOleDoConvert(LPSTORAGE lpStg, REFCLSID rClsidNew)
{
SCODE sc;
CLSID clsidOld;
if ((sc = ReadClassStg(lpStg, &clsidOld)) != S_OK)
{
clsidOld = CLSID_NULL;
return sc;
}
// read old fmt/old user type; sets out params to NULL on error
CLIPFORMAT cfOld;
LPOLESTR lpszOld = NULL;
sc = ReadFmtUserTypeStg(lpStg, &cfOld, &lpszOld);
ASSERT(sc == S_OK || (cfOld == 0 && lpszOld == NULL));
// get new user type name; if error, set to NULL string
OLECHAR chZero = 0;
LPOLESTR lpszNew = NULL;
if (OleRegGetUserType(rClsidNew, USERCLASSTYPE_FULL, &lpszNew) != S_OK)
lpszNew = &chZero;
// write class stg
if ((sc = WriteClassStg(lpStg, rClsidNew)) != S_OK)
goto ErrorReturn;
// write old fmt/new user type;
if ((sc = WriteFmtUserTypeStg(lpStg, cfOld, lpszNew)) != S_OK)
goto RewriteInfo;
// set convert bit
if ((sc = SetConvertStg(lpStg, TRUE)) != S_OK)
goto RewriteInfo;
goto ErrorReturn;
RewriteInfo:
WriteClassStg(lpStg, clsidOld);
WriteFmtUserTypeStg(lpStg, cfOld, lpszOld);
ErrorReturn:
if (lpszNew != &chZero)
CoTaskMemFree(lpszNew);
CoTaskMemFree(lpszOld);
return sc;
}
SCODE AFXAPI _AfxOleDoTreatAsClass(
LPCTSTR lpszUserType, REFCLSID rclsid, REFCLSID rclsidNew)
{
LPTSTR lpszCLSID = NULL;
HKEY hKey;
SCODE sc = CoTreatAsClass(rclsid, rclsidNew);
if (sc != S_OK && lpszUserType != NULL)
{
RegOpenKey(HKEY_CLASSES_ROOT, _T("CLSID"), &hKey);
LPOLESTR lpOleStr = NULL;
StringFromCLSID(rclsid, &lpOleStr);
lpszCLSID = TASKSTRINGOLE2T(lpOleStr);
RegSetValue(hKey, lpszCLSID, REG_SZ, lpszUserType,
lstrlen(lpszUserType) * sizeof(TCHAR));
CoTaskMemFree(lpszCLSID);
sc = CoTreatAsClass(rclsid, rclsidNew);
RegCloseKey(hKey);
}
return sc;
}
#define DEVNAMEPART(pdn, x) (pdn->x == 0 ? NULL : (LPCTSTR)pdn + pdn->x)
DVTARGETDEVICE* AFXAPI _AfxOleCreateTargetDevice(LPDEVNAMES pDN, LPDEVMODE pDM)
{
USES_CONVERSION;
DVTARGETDEVICE* ptd = NULL;
DWORD dwDevNamesSize, dwDevModeSize, dwPtdSize;
LPCTSTR lpszDriverName = DEVNAMEPART(pDN, wDriverOffset);
LPCTSTR lpszDeviceName = DEVNAMEPART(pDN, wDeviceOffset);
LPCTSTR lpszPortName = DEVNAMEPART(pDN, wOutputOffset);
LPCOLESTR lpszDriverNameOle = T2COLE(lpszDriverName);
LPCOLESTR lpszDeviceNameOle = T2COLE(lpszDeviceName);
LPCOLESTR lpszPortNameOle = T2COLE(lpszPortName);
int nDriverNameSize = (lpszDriverNameOle == NULL) ? 0 : (ocslen(lpszDriverNameOle)+1)*sizeof(OLECHAR);
int nDeviceNameSize = (lpszDeviceNameOle == NULL) ? 0 : (ocslen(lpszDeviceNameOle)+1)*sizeof(OLECHAR);
int nPortNameSize = (lpszPortNameOle == NULL) ? 0 : (ocslen(lpszPortNameOle)+1)*sizeof(OLECHAR);
LPDEVMODEOLE lpDevModeOle = DEVMODET2OLE(pDM);
dwDevNamesSize = nDriverNameSize + nDeviceNameSize + nPortNameSize;
dwDevModeSize = (DWORD)(lpDevModeOle->dmSize + lpDevModeOle->dmDriverExtra);
dwPtdSize = sizeof(DVTARGETDEVICE) + dwDevNamesSize + dwDevModeSize;
if ((ptd = (DVTARGETDEVICE*)CoTaskMemAlloc(dwPtdSize)) != NULL)
{
// copy in the info
ptd->tdSize = (UINT)dwPtdSize;
ptd->tdDriverNameOffset = sizeof(DVTARGETDEVICE);
ocscpy((LPOLESTR)((BYTE*)ptd + ptd->tdDriverNameOffset), lpszDriverNameOle);
ptd->tdDeviceNameOffset = (WORD)(ptd->tdDriverNameOffset + nDriverNameSize);
ocscpy((LPOLESTR)((BYTE*)ptd + ptd->tdDeviceNameOffset), lpszDeviceNameOle);
ptd->tdPortNameOffset = (WORD)(ptd->tdDeviceNameOffset + nDeviceNameSize);
ocscpy((LPOLESTR)((BYTE*)ptd + ptd->tdPortNameOffset), lpszPortNameOle);
ptd->tdExtDevmodeOffset = (WORD)(ptd->tdPortNameOffset + nPortNameSize);
memcpy((BYTE*)ptd + ptd->tdExtDevmodeOffset, lpDevModeOle,
sizeof(DEVMODEOLE)+lpDevModeOle->dmDriverExtra);
}
return ptd;
}
DVTARGETDEVICE* AFXAPI _AfxOleCreateTargetDevice(LPPRINTDLG lpPrintDlg)
{
DVTARGETDEVICE* ptd=NULL;
LPDEVNAMES pDN;
LPDEVMODE pDM;
if ((pDN = (LPDEVNAMES)GlobalLock(lpPrintDlg->hDevNames)) == NULL)
return NULL;
if ((pDM = (LPDEVMODE)GlobalLock(lpPrintDlg->hDevMode)) == NULL)
{
GlobalUnlock(lpPrintDlg->hDevNames);
return NULL;
}
ptd = _AfxOleCreateTargetDevice(pDN, pDM);
GlobalUnlock(lpPrintDlg->hDevNames);
GlobalUnlock(lpPrintDlg->hDevMode);
return ptd;
}
LPMONIKER AFXAPI _AfxOleGetFirstMoniker(LPMONIKER lpmk)
{
if (lpmk == NULL)
return NULL;
DWORD dwMksys;
if (lpmk->IsSystemMoniker(&dwMksys) == S_OK
&& dwMksys == MKSYS_GENERICCOMPOSITE)
{
LPENUMMONIKER lpenumMoniker = NULL;
SCODE sc = lpmk->Enum(TRUE, &lpenumMoniker);
if (sc != S_OK)
return NULL;
ASSERT(lpenumMoniker != NULL);
LPMONIKER lpmkFirst = NULL;
sc = lpenumMoniker->Next(1, &lpmkFirst, NULL);
RELEASE(lpenumMoniker);
return lpmkFirst;
}
// otherwise -- return the moniker itself
lpmk->AddRef();
return lpmk;
}
DWORD AFXAPI _AfxOleGetLenFilePrefixOfMoniker(LPMONIKER lpmk)
{
USES_CONVERSION;
if (lpmk == NULL)
return 0;
DWORD nLen = 0;
LPMONIKER lpmkFirst = _AfxOleGetFirstMoniker(lpmk);
if (lpmkFirst != NULL)
{
DWORD dwMksys;
if (lpmkFirst->IsSystemMoniker(&dwMksys) == S_OK &&
dwMksys == MKSYS_FILEMONIKER)
{
LPBC lpbc = NULL;
SCODE sc = CreateBindCtx(0, &lpbc);
if (sc == S_OK)
{
LPOLESTR lpw = NULL;
sc = lpmkFirst->GetDisplayName(lpbc, NULL, &lpw);
LPTSTR lpsz = OLE2T(lpw);
if (sc == S_OK && lpsz != NULL)
{
nLen = lstrlen(lpsz);
CoTaskMemFree(lpw);
}
RELEASE(lpbc);
}
}
RELEASE(lpmkFirst);
}
return nLen;
}
DVTARGETDEVICE* AFXAPI _AfxOleCopyTargetDevice(DVTARGETDEVICE* ptdSrc)
{
if (ptdSrc == NULL)
return NULL;
DVTARGETDEVICE* ptdDest =
(DVTARGETDEVICE*)CoTaskMemAlloc(ptdSrc->tdSize);
if (ptdDest == NULL)
return NULL;
memcpy(ptdDest, ptdSrc, (size_t)ptdSrc->tdSize);
return ptdDest;
}
void AFXAPI _AfxOleCopyFormatEtc(LPFORMATETC petcDest, LPFORMATETC petcSrc)
{
ASSERT(petcDest != NULL);
ASSERT(petcSrc != NULL);
petcDest->cfFormat = petcSrc->cfFormat;
petcDest->ptd = _AfxOleCopyTargetDevice(petcSrc->ptd);
petcDest->dwAspect = petcSrc->dwAspect;
petcDest->lindex = petcSrc->lindex;
petcDest->tymed = petcSrc->tymed;
}
HDC WINAPI _AfxOleCreateDC(DVTARGETDEVICE* ptd)
{
USES_CONVERSION;
// return screen DC for NULL target device
if (ptd == NULL)
return ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
LPDEVMODEOLE lpDevMode;
LPOLESTR lpszDriverName;
LPOLESTR lpszDeviceName;
LPOLESTR lpszPortName;
if (ptd->tdExtDevmodeOffset == 0)
lpDevMode = NULL;
else
lpDevMode = (LPDEVMODEOLE) ((LPSTR)ptd + ptd->tdExtDevmodeOffset);
lpszDriverName = (LPOLESTR)((BYTE*)ptd + ptd->tdDriverNameOffset);
lpszDeviceName = (LPOLESTR)((BYTE*)ptd + ptd->tdDeviceNameOffset);
lpszPortName = (LPOLESTR)((BYTE*)ptd + ptd->tdPortNameOffset);
return ::CreateDC(OLE2CT(lpszDriverName), OLE2CT(lpszDeviceName),
OLE2CT(lpszPortName), DEVMODEOLE2T(lpDevMode));
}
void AFXAPI _AfxDeleteMetafilePict(HGLOBAL hMetaPict)
{
if (hMetaPict != NULL)
{
STGMEDIUM stgMedium;
stgMedium.hGlobal = hMetaPict;
stgMedium.tymed = TYMED_MFPICT;
stgMedium.pUnkForRelease = NULL;
ReleaseStgMedium(&stgMedium);
}
}
#define HIMETRIC_PER_INCH 2540
#define MAP_PIX_TO_LOGHIM(x,ppli) MulDiv(HIMETRIC_PER_INCH, (x), (ppli))
#define MAP_LOGHIM_TO_PIX(x,ppli) MulDiv((ppli), (x), HIMETRIC_PER_INCH)
void AFXAPI _AfxXformSizeInPixelsToHimetric(
HDC hDC, LPSIZEL lpSizeInPix, LPSIZEL lpSizeInHiMetric)
{
int cxPPI;
int cyPPI;
if ((NULL == hDC) || (GetDeviceCaps(hDC, LOGPIXELSX) == 0))
{
cxPPI = afxData.cxPixelsPerInch;
cyPPI = afxData.cyPixelsPerInch;
}
else
{
cxPPI = GetDeviceCaps(hDC, LOGPIXELSX);
cyPPI = GetDeviceCaps(hDC, LOGPIXELSY);
}
lpSizeInHiMetric->cx = (long)MAP_PIX_TO_LOGHIM((int)lpSizeInPix->cx, cxPPI);
lpSizeInHiMetric->cy = (long)MAP_PIX_TO_LOGHIM((int)lpSizeInPix->cy, cyPPI);
}
void AFXAPI _AfxXformSizeInHimetricToPixels(
HDC hDC, LPSIZEL lpSizeInHiMetric, LPSIZEL lpSizeInPix)
{
int cxPPI;
int cyPPI;
if ((NULL == hDC) || (GetDeviceCaps(hDC, LOGPIXELSX) == 0))
{
cxPPI = afxData.cxPixelsPerInch;
cyPPI = afxData.cyPixelsPerInch;
}
else
{
cxPPI = GetDeviceCaps(hDC, LOGPIXELSX);
cyPPI = GetDeviceCaps(hDC, LOGPIXELSY);
}
lpSizeInPix->cx = (long)MAP_LOGHIM_TO_PIX((int)lpSizeInHiMetric->cx, cxPPI);
lpSizeInPix->cy = (long)MAP_LOGHIM_TO_PIX((int)lpSizeInHiMetric->cy, cyPPI);
}
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNAMIC(COleException, CException)
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -