TARGTDEV.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:9k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*************************************************************************
  2. **
  3. **    OLE 2 Standard Utilities
  4. **
  5. **    olestd.c
  6. **
  7. **    This file contains utilities that are useful for dealing with
  8. **    target devices.
  9. **
  10. **    (c) Copyright Microsoft Corp. 1992-1996 All Rights Reserved
  11. **
  12. *************************************************************************/
  13. #define STRICT  1
  14. #include "olestd.h"
  15. #ifndef WIN32
  16. #include <print.h>
  17. #endif
  18. /*
  19.  * OleStdCreateDC()
  20.  *
  21.  * Purpose:
  22.  *
  23.  * Parameters:
  24.  *
  25.  * Return Value:
  26.  *    SCODE  -  S_OK if successful
  27.  */
  28. STDAPI_(HDC) OleStdCreateDC(DVTARGETDEVICE FAR* ptd)
  29. {
  30.         HDC hdc=NULL;
  31.         LPDEVNAMES lpDevNames;
  32.         LPDEVMODE lpDevMode;
  33.         LPSTR lpszDriverName;
  34.         LPSTR lpszDeviceName;
  35.         LPSTR lpszPortName;
  36.         if (ptd == NULL) {
  37.                 hdc = CreateDC("DISPLAY", NULL, NULL, NULL);
  38.                 goto errReturn;
  39.         }
  40.         lpDevNames = (LPDEVNAMES) ptd; // offset for size field
  41.         if (ptd->tdExtDevmodeOffset == 0) {
  42.                 lpDevMode = NULL;
  43.         }else{
  44.                 lpDevMode  = (LPDEVMODE) (/*(LPSTR)*/ptd + ptd->tdExtDevmodeOffset);
  45.         }
  46.         lpszDriverName = (LPSTR) lpDevNames + ptd->tdDriverNameOffset;
  47.         lpszDeviceName = (LPSTR) lpDevNames + ptd->tdDeviceNameOffset;
  48.         lpszPortName   = (LPSTR) lpDevNames + ptd->tdPortNameOffset;
  49.         hdc = CreateDC(lpszDriverName, lpszDeviceName, lpszPortName, lpDevMode);
  50. errReturn:
  51.         return hdc;
  52. }
  53. /*
  54.  * OleStdCreateIC()
  55.  *
  56.  * Purpose: Same as OleStdCreateDC, except that information context is
  57.  *          created, rather than a whole device context.  (CreateIC is
  58.  *          used rather than CreateDC).
  59.  *          OleStdDeleteDC is still used to delete the information context.
  60.  *
  61.  * Parameters:
  62.  *
  63.  * Return Value:
  64.  *    SCODE  -  S_OK if successful
  65.  */
  66. STDAPI_(HDC) OleStdCreateIC(DVTARGETDEVICE FAR* ptd)
  67. {
  68.         HDC hdcIC=NULL;
  69.         LPDEVNAMES lpDevNames;
  70.         LPDEVMODE lpDevMode;
  71.         LPSTR lpszDriverName;
  72.         LPSTR lpszDeviceName;
  73.         LPSTR lpszPortName;
  74.         if (ptd == NULL) {
  75.                 hdcIC = CreateIC("DISPLAY", NULL, NULL, NULL);
  76.                 goto errReturn;
  77.         }
  78.         lpDevNames = (LPDEVNAMES) ptd; // offset for size field
  79.         lpDevMode  = (LPDEVMODE) (/*(LPSTR)*/ptd + ptd->tdExtDevmodeOffset);
  80.         lpszDriverName = (LPSTR) lpDevNames + ptd->tdDriverNameOffset;
  81.         lpszDeviceName = (LPSTR) lpDevNames + ptd->tdDeviceNameOffset;
  82.         lpszPortName   = (LPSTR) lpDevNames + ptd->tdPortNameOffset;
  83.         hdcIC = CreateIC(lpszDriverName, lpszDeviceName, lpszPortName, lpDevMode);
  84. errReturn:
  85.         return hdcIC;
  86. }
  87. /*
  88.  * OleStdCreateTargetDevice()
  89.  *
  90.  * Purpose:
  91.  *
  92.  * Parameters:
  93.  *
  94.  * Return Value:
  95.  *    SCODE  -  S_OK if successful
  96.  */
  97. STDAPI_(DVTARGETDEVICE FAR*) OleStdCreateTargetDevice(LPPRINTDLG lpPrintDlg)
  98. {
  99.         DVTARGETDEVICE FAR* ptd=NULL;
  100.         LPDEVNAMES lpDevNames, pDN;
  101.         LPDEVMODE lpDevMode, pDM;
  102.         UINT nMaxOffset;
  103.         LPSTR pszName;
  104.         DWORD dwDevNamesSize, dwDevModeSize, dwPtdSize;
  105.         if ((pDN = (LPDEVNAMES)GlobalLock(lpPrintDlg->hDevNames)) == NULL) {
  106.                 goto errReturn;
  107.         }
  108.         if ((pDM = (LPDEVMODE)GlobalLock(lpPrintDlg->hDevMode)) == NULL) {
  109.                 goto errReturn;
  110.         }
  111.         nMaxOffset =  (pDN->wDriverOffset > pDN->wDeviceOffset) ?
  112.                 pDN->wDriverOffset : pDN->wDeviceOffset ;
  113.         nMaxOffset =  (pDN->wOutputOffset > nMaxOffset) ?
  114.                 pDN->wOutputOffset : nMaxOffset ;
  115.         pszName = (LPSTR)pDN + nMaxOffset;
  116.         dwDevNamesSize = (DWORD)(nMaxOffset+lstrlen(pszName) + 1/* NULL term */);
  117.         dwDevModeSize = (DWORD) (pDM->dmSize + pDM->dmDriverExtra);
  118.         dwPtdSize = sizeof(DWORD) + dwDevNamesSize + dwDevModeSize;
  119.         if ((ptd = (DVTARGETDEVICE FAR*)OleStdMalloc(dwPtdSize)) != NULL) {
  120.                 // copy in the info
  121.                 ptd->tdSize = (UINT)dwPtdSize;
  122.                 lpDevNames = (LPDEVNAMES) &ptd->tdDriverNameOffset;
  123.                 _fmemcpy(lpDevNames, pDN, (size_t)dwDevNamesSize);
  124.                 lpDevMode=(LPDEVMODE)(/*(LPSTR)*/&ptd->tdDriverNameOffset+dwDevNamesSize);
  125.                 _fmemcpy(lpDevMode, pDM, (size_t)dwDevModeSize);
  126.                 ptd->tdDriverNameOffset += 4 ;
  127.                 ptd->tdDeviceNameOffset += 4 ;
  128.                 ptd->tdPortNameOffset   += 4 ;
  129.                 ptd->tdExtDevmodeOffset = (UINT)dwDevNamesSize + 4 ;
  130.         }
  131. errReturn:
  132.         GlobalUnlock(lpPrintDlg->hDevNames);
  133.         GlobalUnlock(lpPrintDlg->hDevMode);
  134.         return ptd;
  135. }
  136. /*
  137.  * OleStdDeleteTargetDevice()
  138.  *
  139.  * Purpose:
  140.  *
  141.  * Parameters:
  142.  *
  143.  * Return Value:
  144.  *    SCODE  -  S_OK if successful
  145.  */
  146. STDAPI_(BOOL) OleStdDeleteTargetDevice(DVTARGETDEVICE FAR* ptd)
  147. {
  148.         BOOL res=TRUE;
  149.         if (ptd != NULL) {
  150.                 OleStdFree(ptd);
  151.         }
  152.         return res;
  153. }
  154. /*
  155.  * OleStdCopyTargetDevice()
  156.  *
  157.  * Purpose:
  158.  *  duplicate a TARGETDEVICE struct. this function allocates memory for
  159.  *  the copy. the caller MUST free the allocated copy when done with it
  160.  *  using the standard allocator returned from CoGetMalloc.
  161.  *  (OleStdFree can be used to free the copy).
  162.  *
  163.  * Parameters:
  164.  *  ptdSrc      pointer to source TARGETDEVICE
  165.  *
  166.  * Return Value:
  167.  *    pointer to allocated copy of ptdSrc
  168.  *    if ptdSrc==NULL then retuns NULL is returned.
  169.  *    if ptdSrc!=NULL and memory allocation fails, then NULL is returned
  170.  */
  171. STDAPI_(DVTARGETDEVICE FAR*) OleStdCopyTargetDevice(DVTARGETDEVICE FAR* ptdSrc)
  172. {
  173.   DVTARGETDEVICE FAR* ptdDest = NULL;
  174.   if (ptdSrc == NULL) {
  175.         return NULL;
  176.   }
  177.   if ((ptdDest = (DVTARGETDEVICE FAR*)OleStdMalloc(ptdSrc->tdSize)) != NULL) {
  178.         _fmemcpy(ptdDest, ptdSrc, (size_t)ptdSrc->tdSize);
  179.   }
  180.   return ptdDest;
  181. }
  182. /*
  183.  * OleStdCopyFormatEtc()
  184.  *
  185.  * Purpose:
  186.  *  Copies the contents of a FORMATETC structure. this function takes
  187.  *  special care to copy correctly copying the pointer to the TARGETDEVICE
  188.  *  contained within the source FORMATETC structure.
  189.  *  if the source FORMATETC has a non-NULL TARGETDEVICE, then a copy
  190.  *  of the TARGETDEVICE will be allocated for the destination of the
  191.  *  FORMATETC (petcDest).
  192.  *
  193.  *  NOTE: the caller MUST free the allocated copy of the TARGETDEVICE
  194.  *  within the destination FORMATETC when done with it
  195.  *  using the standard allocator returned from CoGetMalloc.
  196.  *  (OleStdFree can be used to free the copy).
  197.  *
  198.  * Parameters:
  199.  *  petcDest      pointer to destination FORMATETC
  200.  *  petcSrc       pointer to source FORMATETC
  201.  *
  202.  * Return Value:
  203.  *    returns TRUE is copy is successful; retuns FALSE if not successful
  204.  */
  205. STDAPI_(BOOL) OleStdCopyFormatEtc(LPFORMATETC petcDest, LPFORMATETC petcSrc)
  206. {
  207.   if ((petcDest == NULL) || (petcSrc == NULL)) {
  208.         return FALSE;
  209.   }
  210.   petcDest->cfFormat = petcSrc->cfFormat;
  211.   petcDest->ptd      = OleStdCopyTargetDevice(petcSrc->ptd);
  212.   petcDest->dwAspect = petcSrc->dwAspect;
  213.   petcDest->lindex   = petcSrc->lindex;
  214.   petcDest->tymed    = petcSrc->tymed;
  215.   return TRUE;
  216. }
  217. // returns 0 for exact match, 1 for no match, -1 for partial match (which is
  218. // defined to mean the left is a subset of the right: fewer aspects, null target
  219. // device, fewer medium).
  220. STDAPI_(int) OleStdCompareFormatEtc(FORMATETC FAR* pFetcLeft, FORMATETC FAR* pFetcRight)
  221. {
  222.         BOOL bExact = TRUE;
  223.         if (pFetcLeft->cfFormat != pFetcRight->cfFormat)
  224.                 return 1;
  225.         else if (!OleStdCompareTargetDevice (pFetcLeft->ptd, pFetcRight->ptd))
  226.                 return 1;
  227.         if (pFetcLeft->dwAspect == pFetcRight->dwAspect)
  228.                 // same aspects; equal
  229.                 ;
  230.         else if ((pFetcLeft->dwAspect & ~pFetcRight->dwAspect) != 0)
  231.                 // left not subset of aspects of right; not equal
  232.                 return 1;
  233.         else
  234.                 // left subset of right
  235.                 bExact = FALSE;
  236.         if (pFetcLeft->tymed == pFetcRight->tymed)
  237.                 // same medium flags; equal
  238.                 ;
  239.         else if ((pFetcLeft->tymed & ~pFetcRight->tymed) != 0)
  240.                 // left not subset of medium flags of right; not equal
  241.                 return 1;
  242.         else
  243.                 // left subset of right
  244.                 bExact = FALSE;
  245.         return bExact ? 0 : -1;
  246. }
  247. STDAPI_(BOOL) OleStdCompareTargetDevice
  248.         (DVTARGETDEVICE FAR* ptdLeft, DVTARGETDEVICE FAR* ptdRight)
  249. {
  250.         if (ptdLeft == ptdRight)
  251.                 // same address of td; must be same (handles NULL case)
  252.                 return TRUE;
  253.         else if ((ptdRight == NULL) || (ptdLeft == NULL))
  254.                 return FALSE;
  255.         else if (ptdLeft->tdSize != ptdRight->tdSize)
  256.                 // different sizes, not equal
  257.                 return FALSE;
  258. #ifdef WIN32
  259.         else if (memcmp(ptdLeft, ptdRight, ptdLeft->tdSize) != 0)
  260. #else
  261.         else if (_fmemcmp(ptdLeft, ptdRight, (int)ptdLeft->tdSize) != 0)
  262. #endif
  263.                 // not same target device, not equal
  264.                 return FALSE;
  265.         return TRUE;
  266. }