MINIDRIV.C
上传用户:yuandong
上传日期:2022-08-08
资源大小:954k
文件大小:16k
源码类别:

Delphi控件源码

开发平台:

C++ Builder

  1. /****************************************************************************
  2. *                                                                           *
  3. * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY     *
  4. * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE       *
  5. * IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR     *
  6. * PURPOSE.                                                                  *
  7. *                                                                           *
  8. * Copyright (C) 1993-95  Microsoft Corporation.  All Rights Reserved.       *
  9. *                                                                           *
  10. ****************************************************************************/
  11. #define PRINTDRIVER
  12. #define BUILDDLL
  13. #include "print.h"
  14. #include "gdidefs.inc"
  15. #include "dumb.h"
  16. #include "mdevice.h"
  17. #include "unidrv.h"
  18. extern char *rgchModuleName; // global module name
  19. char szSection[8] = "DUMB,";
  20.  
  21. #ifndef NOCONTROL
  22. short WINAPI Control(lpdv, function, lpInData, lpOutData)
  23. LPDV    lpdv;
  24. WORD    function;
  25. LPSTR   lpInData;
  26. LPSTR   lpOutData;
  27. {
  28.    LPEXTPDEV lpXPDV;
  29.    short sRet;
  30.    // get pointer to our private data stored in UNIDRV's PDEVICE
  31.    lpXPDV = ((LPEXTPDEV)lpdv->lpMd);
  32.    switch (function)
  33.    {
  34.       case SETPRINTERDC:
  35.          // save app's DC for QueryAbort() calls
  36.          if (lpXPDV)
  37.             lpXPDV->hAppDC = *(HANDLE FAR *)lpInData;
  38.          break;
  39.       case NEXTBAND:
  40.       {
  41.          // call UNIDRV.DLL's NEXTBAND to see if we're at end of page
  42.          sRet = UniControl(lpdv, function, lpInData, lpOutData);
  43.          // check for end of page (ie, empty rectangle) or failure
  44.          if ((!IsRectEmpty((LPRECT)lpOutData)) || (sRet <= 0))
  45.             return sRet;
  46.          // open file and store name and file handle in private PDEVICE
  47.  
  48.          if ((lpXPDV->hDIBFile = OpenFile((LPSTR)"nul", (LPOFSTRUCT)&lpXPDV->of, OF_WRITE)) < 0) 
  49.             return SP_ERROR;
  50.          // clean up page stuff
  51.          // initialize job variables
  52.          lpXPDV->dwTotalScans     =
  53.          lpXPDV->dwTotalScanBytes = 0;
  54.          // close current DIB file 
  55.          _lclose(lpXPDV->hDIBFile);
  56.          return (sRet);
  57.       }
  58.       case STARTDOC:
  59.       {
  60.          HANDLE  hInst;
  61.          DOCINFO di;
  62.          // get minidriver instance handle
  63.          hInst = GetModuleHandle((LPSTR)rgchModuleName);
  64.    // start the copy - program that copies all those <temp>~emf*.tmp files to <temp><counter>.emf
  65.  WinExec("copier.exe ", SW_SHOW);
  66.          // pop up dialog box to get file name
  67.          if (!(DialogBoxParam(hInst, "FILEDLG", NULL, FileDlgProc, (LPARAM)lpXPDV)))
  68.             return SP_ERROR;
  69.          // alloc page scan buffer
  70.          if (!(lpXPDV->hScanBuf = GlobalAlloc(GHND, BUF_CHUNK)))
  71.             return SP_ERROR;
  72.          lpXPDV->lpScanBuf = (char _huge *)GlobalLock(lpXPDV->hScanBuf);
  73.          lpXPDV->dwScanBufSize = BUF_CHUNK;
  74.          // initialize job variables
  75.          lpXPDV->iPageNum         = 0;
  76.          lpXPDV->dwTotalScans     =
  77.          lpXPDV->dwTotalScanBytes = 0;
  78.          // pass NUL file to OpenJob
  79.          di.cbSize = sizeof(DOCINFO);
  80.          di.lpszDocName = NULL;
  81.          di.lpszOutput = (LPSTR)"nul";
  82.          // call UNIDRV.DLL's Control()
  83.          sRet = UniControl(lpdv, function, lpInData, (LPSTR)&di);
  84.          // if failure clean up scan buffer
  85.          if (sRet <= 0)
  86.          {
  87.             GlobalUnlock(lpXPDV->hScanBuf);
  88.             GlobalFree(lpXPDV->hScanBuf);
  89.             lpXPDV->hScanBuf = NULL;
  90.          }
  91.          return (sRet);
  92.       }
  93.       case ENDDOC:
  94.       case ABORTDOC:
  95.          // free up scan buffer
  96.          if (lpXPDV->hScanBuf)
  97.          {
  98.             GlobalUnlock(lpXPDV->hScanBuf);
  99.             lpXPDV->hScanBuf = GlobalFree(lpXPDV->hScanBuf);
  100.             lpXPDV->hScanBuf = NULL;
  101.          }
  102.          break;
  103.       default:
  104.          break;
  105.    } // end case
  106.   // call UNIDRV's Control
  107.    return (UniControl(lpdv, function, lpInData, lpOutData));
  108. }
  109. #endif
  110. #ifndef NODEVBITBLT
  111. BOOL WINAPI DevBitBlt(lpdv, DstxOrg, DstyOrg, lpSrcDev, SrcxOrg, SrcyOrg,
  112.                     xExt, yExt, lRop, lpPBrush, lpDrawmode)
  113. LPDV        lpdv;           // --> to destination bitmap descriptor
  114. short       DstxOrg;        // Destination origin - x coordinate
  115. short       DstyOrg;        // Destination origin - y coordinate
  116. LPBITMAP    lpSrcDev;       // --> to source bitmap descriptor
  117. short       SrcxOrg;        // Source origin - x coordinate
  118. short       SrcyOrg;        // Source origin - y coordinate
  119. WORD        xExt;           // x extent of the BLT
  120. WORD        yExt;           // y extent of the BLT
  121. long        lRop;           // Raster operation descriptor
  122. LPPBRUSH    lpPBrush;       // --> to a physical brush (pattern)
  123. LPDRAWMODE  lpDrawmode;
  124. {
  125.     return UniBitBlt(lpdv, DstxOrg, DstyOrg, lpSrcDev, SrcxOrg, SrcyOrg,
  126.                     xExt, yExt, lRop, lpPBrush, lpDrawmode);
  127. }
  128. #endif
  129. #ifndef NOPIXEL
  130. DWORD WINAPI Pixel(lpdv, x, y, Color, lpDrawMode)
  131. LPDV        lpdv;
  132. short       x;
  133. short       y;
  134. DWORD       Color;
  135. LPDRAWMODE  lpDrawMode;
  136. {
  137.     return UniPixel(lpdv, x, y, Color, lpDrawMode);
  138. }
  139. #endif
  140. #ifndef NOOUTPUT
  141. short WINAPI Output(lpdv, style, count, lpPoints, lpPPen, lpPBrush, lpDrawMode, lpCR)
  142. LPDV        lpdv;       // --> to the destination
  143. WORD        style;      // Output operation
  144. WORD        count;      // # of points
  145. LPPOINT     lpPoints;   // --> to a set of points
  146. LPVOID      lpPPen;     // --> to physical pen
  147. LPPBRUSH    lpPBrush;   // --> to physical brush
  148. LPDRAWMODE  lpDrawMode; // --> to a Drawing mode
  149. LPRECT      lpCR;       // --> to a clipping rectange if <> 0
  150. {
  151.     return UniOutput(lpdv, style, count, lpPoints, lpPPen, lpPBrush, lpDrawMode, lpCR);
  152. }
  153. #endif
  154. #ifndef NOSTRBLT
  155. DWORD WINAPI StrBlt(lpdv, x, y, lpCR, lpStr, count, lpFont, lpDrawMode, lpXform)
  156. LPDV        lpdv;
  157. short       x;
  158. short       y;
  159. LPRECT      lpCR;
  160. LPSTR       lpStr;
  161. int         count;
  162. LPFONTINFO  lpFont;
  163. LPDRAWMODE  lpDrawMode;           // includes background mode and bkColor
  164. LPTEXTXFORM lpXform;
  165. {
  166.     // StrBlt is never called by GDI.
  167.     // Keep a stub function here so nobody complains.
  168.     //
  169.     return 0;
  170. }
  171. #endif
  172. #ifndef NOSCANLR
  173. short WINAPI ScanLR(lpdv, x, y, Color, DirStyle)
  174. LPDV    lpdv;
  175. short   x;
  176. short   y;
  177. DWORD   Color;
  178. WORD    DirStyle;
  179. {
  180.     // ScanLR is only called for RASDISPLAY devices.
  181.     // Keep a stub function here so nobody complains.
  182.     //
  183.     return 0;
  184. }
  185. #endif
  186. #ifndef NOENUMOBJ
  187. short WINAPI EnumObj(lpdv, style, lpCallbackFunc, lpClientData)
  188. LPDV    lpdv;
  189. WORD    style;
  190. FARPROC lpCallbackFunc;
  191. LPVOID  lpClientData;
  192. {
  193.     return UniEnumObj(lpdv, style, lpCallbackFunc, lpClientData);
  194. }
  195. #endif
  196. #ifndef NOCOLORINFO
  197. DWORD WINAPI ColorInfo(lpdv, ColorIn, lpPhysBits)
  198. LPDV    lpdv;
  199. DWORD   ColorIn;
  200. LPDWORD lpPhysBits;
  201. {
  202.     return UniColorInfo(lpdv, ColorIn, lpPhysBits);
  203. }
  204. #endif
  205. #ifndef NODEVICEMODE
  206. void WINAPI DeviceMode(hWnd, hInst, lpDevName, lpPort)
  207. HWND    hWnd;
  208. HANDLE  hInst;
  209. LPSTR   lpDevName;
  210. LPSTR   lpPort;
  211. {
  212.     UniDeviceMode(hWnd, hInst, lpDevName, lpPort);
  213. }
  214. #endif
  215. #ifndef NOREALIZEOBJECT
  216. DWORD WINAPI RealizeObject(lpdv, sStyle, lpInObj, lpOutObj, lpTextXForm)
  217. LPDV        lpdv;
  218. short       sStyle;
  219. LPSTR       lpInObj;
  220. LPSTR       lpOutObj;
  221. LPTEXTXFORM lpTextXForm;
  222. {
  223.     return UniRealizeObject(lpdv, sStyle, lpInObj, lpOutObj, lpTextXForm);
  224. }
  225. #endif
  226. #ifndef NOENUMDFONTS
  227. short WINAPI EnumDFonts(lpdv, lpFaceName, lpCallbackFunc, lpClientData)
  228. LPDV    lpdv;
  229. LPSTR   lpFaceName;
  230. FARPROC lpCallbackFunc;
  231. LPVOID  lpClientData;
  232. {
  233.     return UniEnumDFonts(lpdv, lpFaceName, lpCallbackFunc, lpClientData);
  234. }
  235. #endif
  236. #ifndef NOENABLE
  237. short WINAPI Enable(lpdv, style, lpModel, lpPort, lpStuff)
  238. LPDV    lpdv;
  239. WORD    style;
  240. LPSTR   lpModel;
  241. LPSTR   lpPort;
  242. LPDM    lpStuff;
  243. {
  244.     CUSTOMDATA cd;
  245.     short sRet;
  246.     cd.cbSize = sizeof(CUSTOMDATA);
  247.     cd.hMd = GetModuleHandle((LPSTR)rgchModuleName);
  248.     // output raster graphics in portrait and landscape orientation.
  249.     cd.fnOEMDump = fnDump;
  250.     if (!(sRet = UniEnable(lpdv, style, lpModel, lpPort, lpStuff, &cd)))
  251.    return (sRet);
  252.     // Allocate private PDEVICE
  253.     if (style == 0)
  254.  {
  255.       // allocate space for our private data
  256.    if (!(lpdv->hMd = GlobalAlloc(GHND, sizeof(EXTPDEV))))
  257.       return 0;
  258.    lpdv->lpMd = GlobalLock(lpdv->hMd);
  259.  }
  260.     return sRet;
  261.  }
  262. #endif
  263. #ifndef NODISABLE
  264. void WINAPI Disable(lpdv)
  265. LPDV lpdv;
  266. {
  267.    // if allocated private PDEVICE data
  268.    if (lpdv->hMd)
  269. {
  270.       LPEXTPDEV lpXPDV;
  271.       // get pointer to our private data stored in UNIDRV's PDEVICE
  272.       lpXPDV = ((LPEXTPDEV)lpdv->lpMd);
  273.       // check to see if scan buffer is still around
  274.       if (lpXPDV->hScanBuf)
  275.       {
  276.          GlobalUnlock(lpXPDV->hScanBuf);
  277.          GlobalFree(lpXPDV->hScanBuf);
  278.       }
  279.       // free private PDEVICE buffer
  280.       if (lpdv->hMd)
  281.       {
  282.       GlobalUnlock(lpdv->hMd);
  283.       GlobalFree(lpdv->hMd);
  284.       }
  285. }
  286.    UniDisable(lpdv);
  287. }
  288. #endif
  289. #ifndef NODEVEXTTEXTOUT
  290. DWORD WINAPI DevExtTextOut(lpdv, x, y, lpCR, lpStr, count, lpFont,
  291.                         lpDrawMode, lpXform, lpWidths, lpOpaqRect, options)
  292. LPDV        lpdv;
  293. short       x;
  294. short       y;
  295. LPRECT      lpCR;
  296. LPSTR       lpStr;
  297. int         count;
  298. LPFONTINFO  lpFont;
  299. LPDRAWMODE  lpDrawMode;
  300. LPTEXTXFORM lpXform;
  301. LPSHORT     lpWidths;
  302. LPRECT      lpOpaqRect;
  303. WORD        options;
  304. {
  305.     return(UniExtTextOut(lpdv, x, y, lpCR, lpStr, count, lpFont,
  306.                         lpDrawMode, lpXform, lpWidths, lpOpaqRect, options));
  307. }
  308. #endif
  309. #ifndef NODEVGETCHARWIDTH
  310. short WINAPI DevGetCharWidth(lpdv, lpBuf, chFirst, chLast, lpFont, lpDrawMode,
  311.                         lpXForm)
  312. LPDV        lpdv;
  313. LPSHORT     lpBuf;
  314. WORD        chFirst;
  315. WORD        chLast;
  316. LPFONTINFO  lpFont;
  317. LPDRAWMODE  lpDrawMode;
  318. LPTEXTXFORM lpXForm;
  319. {
  320.     return(UniGetCharWidth(lpdv, lpBuf, chFirst, chLast, lpFont,lpDrawMode,
  321.                           lpXForm));
  322. }
  323. #endif
  324. #ifndef NODEVICEBITMAP
  325. short WINAPI DeviceBitmap(lpdv, command, lpBitMap, lpBits)
  326. LPDV     lpdv;
  327. WORD     command;
  328. LPBITMAP lpBitMap;
  329. LPSTR    lpBits;
  330. {
  331.     return 0;
  332. }
  333. #endif
  334. #ifndef NOFASTBORDER
  335. short WINAPI FastBorder(lpRect, width, depth, lRop, lpdv, lpPBrush,
  336.                                           lpDrawmode, lpCR)
  337. LPRECT  lpRect;
  338. short   width;
  339. short   depth;
  340. long    lRop;
  341. LPDV    lpdv;
  342. long    lpPBrush;
  343. long    lpDrawmode;
  344. LPRECT  lpCR;
  345. {
  346.     return 0;
  347. }
  348. #endif
  349. #ifndef NOSETATTRIBUTE
  350. short WINAPI SetAttribute(lpdv, statenum, index, attribute)
  351. LPDV    lpdv;
  352. WORD    statenum;
  353. WORD    index;
  354. WORD    attribute;
  355. {
  356.     return 0;
  357. }
  358. #endif
  359. #ifndef NODEVMODE
  360. int WINAPI ExtDeviceMode(hWnd, hInst, lpdmOut, lpDevName, lpPort,
  361.                               lpdmIn, lpProfile, wMode)
  362. HWND    hWnd;           // parent for DM_PROMPT dialog box
  363. HANDLE  hInst;          // handle from LoadLibrary()
  364. LPDM    lpdmOut;        // output DEVMODE for DM_COPY
  365. LPSTR   lpDevName;      // device name
  366. LPSTR   lpPort;         // port name
  367. LPDM    lpdmIn;         // input DEVMODE for DM_MODIFY
  368. LPSTR   lpProfile;      // alternate .INI file
  369. WORD    wMode;          // operation(s) to carry out
  370. {
  371.     return UniExtDeviceMode(hWnd, hInst, lpdmOut, lpDevName, lpPort, lpdmIn,
  372.                            lpProfile, wMode);
  373. }
  374. #endif
  375. #ifndef WANT_WIN30
  376. #ifndef NODMPS
  377. int WINAPI ExtDeviceModePropSheet(hWnd, hInst, lpDevName, lpPort,
  378.                               dwReserved, lpfnAdd, lParam)
  379. HWND                 hWnd;        // Parent window for dialog
  380. HANDLE               hInst;       // handle from LoadLibrary()
  381. LPSTR                lpDevName;   // friendly name
  382. LPSTR                lpPort;      // port name
  383. DWORD                dwReserved;  // for future use
  384. LPFNADDPROPSHEETPAGE lpfnAdd;     // Callback to add dialog page
  385. LPARAM               lParam;      // Pass to callback
  386. {
  387.     return UniExtDeviceModePropSheet(hWnd, hInst, lpDevName, lpPort,
  388.                                      dwReserved, lpfnAdd, lParam);
  389. }
  390. #endif
  391. #endif
  392. #ifndef NODEVICECAPABILITIES
  393. DWORD WINAPI DeviceCapabilities(lpDevName, lpPort, wIndex, lpOutput, lpdm)
  394. LPSTR   lpDevName;
  395. LPSTR   lpPort;
  396. WORD    wIndex;
  397. LPSTR   lpOutput;
  398. LPDM    lpdm;
  399. {
  400.     return(UniDeviceCapabilities(lpDevName, lpPort, wIndex, lpOutput, lpdm,
  401.                     GetModuleHandle((LPSTR)rgchModuleName)));
  402. }
  403. #endif
  404. #ifndef NOADVANCEDSETUPDIALOG
  405. LONG WINAPI AdvancedSetUpDialog(hWnd, hInstMiniDrv, lpdmIn, lpdmOut)
  406. HWND    hWnd;
  407. HANDLE  hInstMiniDrv;   // handle of the driver module
  408. LPDM    lpdmIn;         // initial device settings
  409. LPDM    lpdmOut;        // final device settings
  410. {
  411.     return(UniAdvancedSetUpDialog(hWnd, hInstMiniDrv, lpdmIn, lpdmOut));
  412. }
  413. #endif
  414. #ifndef NODIBBLT
  415. short WINAPI DIBBLT(lpBmp, style, iStart, sScans, lpDIBits,
  416.                         lpBMI, lpDrawMode, lpConvInfo)
  417. LPBITMAP      lpBmp;
  418. WORD          style;
  419. WORD          iStart;
  420. WORD          sScans;
  421. LPSTR         lpDIBits;
  422. LPBITMAPINFO  lpBMI;
  423. LPDRAWMODE    lpDrawMode;
  424. LPSTR         lpConvInfo;
  425. {
  426.     return(UniDIBBlt(lpBmp, style, iStart, sScans, lpDIBits,
  427.                      lpBMI, lpDrawMode, lpConvInfo));
  428. }
  429. #endif
  430. #ifndef NOCREATEDIBITMAP
  431. short WINAPI CreateDIBitmap()
  432. {
  433.     // CreateDIBitmap is never called by GDI.
  434.     // Keep a stub function here so nobody complains.
  435.     //
  436.     return(0);
  437. }
  438. #endif
  439. #ifndef NOSETDIBITSTODEVICE
  440. short WINAPI SetDIBitsToDevice(lpdv, DstXOrg, DstYOrg, StartScan, NumScans,
  441.                          lpCR, lpDrawMode, lpDIBits, lpDIBHdr, lpConvInfo)
  442. LPDV                lpdv;
  443. WORD                DstXOrg;
  444. WORD                DstYOrg;
  445. WORD                StartScan;
  446. WORD                NumScans;
  447. LPRECT              lpCR;
  448. LPDRAWMODE          lpDrawMode;
  449. LPSTR               lpDIBits;
  450. LPBITMAPINFOHEADER  lpDIBHdr;
  451. LPSTR               lpConvInfo;
  452. {
  453.     return(UniSetDIBitsToDevice(lpdv, DstXOrg, DstYOrg, StartScan, NumScans,
  454.                          lpCR, lpDrawMode, lpDIBits, lpDIBHdr, lpConvInfo));
  455. }
  456. #endif
  457. #ifndef NOSTRETCHDIB
  458. int WINAPI StretchDIB(lpdv, wMode, DstX, DstY, DstXE, DstYE,
  459.                 SrcX, SrcY, SrcXE, SrcYE, lpBits, lpDIBHdr,
  460.                 lpConvInfo, dwRop, lpbr, lpdm, lpClip)
  461. LPDV                lpdv;
  462. WORD                wMode;
  463. short               DstX, DstY, DstXE, DstYE;
  464. short               SrcX, SrcY, SrcXE, SrcYE;
  465. LPSTR               lpBits;             /* pointer to DIBitmap Bits */
  466. LPBITMAPINFOHEADER  lpDIBHdr;           /* pointer to DIBitmap info Block */
  467. LPSTR               lpConvInfo;         /* not used */
  468. DWORD               dwRop;
  469. LPPBRUSH            lpbr;
  470. LPDRAWMODE          lpdm;
  471. LPRECT              lpClip;
  472. {
  473.     return(UniStretchDIB(lpdv, wMode, DstX, DstY, DstXE, DstYE,
  474.                 SrcX, SrcY, SrcXE, SrcYE, lpBits, lpDIBHdr,
  475.                 lpConvInfo, dwRop, lpbr, lpdm, lpClip));
  476. }
  477. #endif
  478. #if 0   // nobody is calling this DDI. Deleted.
  479. #ifndef NOQUERYDEVICENAMES
  480. long WINAPI QueryDeviceNames(lprgDeviceNames)
  481. LPSTR   lprgDeviceNames;
  482. {
  483.     return UniQueryDeviceNames(GetModuleHandle(rgchModuleName),
  484.                               lprgDeviceNames);
  485. }
  486. #endif
  487. #endif
  488. #ifndef NODEVINSTALL
  489. int WINAPI DevInstall(hWnd, lpDevName, lpOldPort, lpNewPort)
  490. HWND    hWnd;
  491. LPSTR   lpDevName;
  492. LPSTR   lpOldPort, lpNewPort;
  493. {
  494.     return UniDevInstall(hWnd, lpDevName, lpOldPort, lpNewPort);
  495. }
  496. #endif
  497. #ifndef NOBITMAPBITS
  498. BOOL WINAPI BitmapBits(lpdv, fFlags, dwCount, lpBits)
  499. LPDV  lpdv;
  500. DWORD fFlags;
  501. DWORD dwCount;
  502. LPSTR lpBits;
  503. {
  504.     return UniBitmapBits(lpdv, fFlags, dwCount, lpBits);
  505. }
  506. #endif
  507. #ifndef NOSELECTBITMAP
  508. BOOL WINAPI DeviceSelectBitmap(lpdv, lpPrevBmp, lpBmp, fFlags)
  509. LPDV     lpdv;
  510. LPBITMAP lpPrevBmp;
  511. LPBITMAP lpBmp;
  512. DWORD    fFlags;
  513. {
  514.     return UniDeviceSelectBitmap(lpdv, lpPrevBmp, lpBmp, fFlags);
  515. }
  516. #endif
  517. VOID WINAPI WEP(fExitWindows)
  518. short fExitWindows;
  519. {
  520. }
  521. #ifndef NOLIBMAIN
  522. int WINAPI LibMain(HANDLE hInstance, WORD wDataSeg, WORD cbHeapSize,
  523.                LPSTR lpszCmdLine)
  524. {
  525.     return 1;
  526. }
  527. #endif