support.c
上传用户:yuandong
上传日期:2022-08-08
资源大小:954k
文件大小:3k
源码类别:

Delphi控件源码

开发平台:

C++ Builder

  1. /*++
  2. Copyright (c) 1990-1998  Microsoft Corporation
  3. All Rights Reserved
  4. Abstract:
  5.     Support routines for WinPrint.
  6. --*/
  7. /*++
  8. *******************************************************************
  9.     G e t P r i n t e r I n f o
  10.     Routine Description:
  11.         This routine allocates the required memory for a
  12.         PRINTER_INFO_? structure and retrieves the information
  13.         from NT.  This returns a pointer to the structure, which
  14.         must be freed by the calling routine.
  15.     Arguments:
  16.                 hPrinter    HANDLE to the printer the job is in
  17.                 StructLevel The structure level to get
  18.                 pErrorCode   => field to place error, if one
  19.     Return Value:
  20.                 PUCHAR => buffer where devmode info is if okay
  21.                 NULL if error - pErrorCode returns error
  22. *******************************************************************
  23. --*/
  24. #include "local.h"
  25. PUCHAR 
  26. GetPrinterInfo(IN  HANDLE   hPrinter,
  27.                IN  ULONG    StructLevel,
  28.                OUT PULONG   pErrorCode)
  29. {
  30.     ULONG   reqbytes, alloc_size;
  31.     PUCHAR  ptr_info;
  32.     USHORT  retry = 2;
  33.     alloc_size = BASE_PRINTER_BUFFER_SIZE;
  34.     /** Allocate a buffer.  **/
  35.     ptr_info = AllocSplMem(alloc_size);
  36.     /** If the buffer isn't big enough, try once more **/
  37.     while (retry--) {
  38.         /** If the alloc / realloc failed, return error **/
  39.         if (!ptr_info) {
  40.             *pErrorCode = ERROR_NOT_ENOUGH_MEMORY;
  41.             return NULL;
  42.         }
  43.         /** Go get the printer information **/
  44.         if (GetPrinter(
  45.               hPrinter,
  46.               StructLevel,
  47.               (PUCHAR)ptr_info,
  48.               alloc_size,
  49.               &reqbytes) == TRUE) {
  50.             /** Got the info - return it **/
  51.             *pErrorCode = 0;
  52.             return (PUCHAR)ptr_info;
  53.         }
  54.         /**
  55.             GetPrinter failed - if not because of insufficient buffer, fail
  56.             the call.  Otherwise, up our hint, re-allocate and try again.
  57.         **/
  58.         *pErrorCode = GetLastError();
  59.         if (*pErrorCode != ERROR_INSUFFICIENT_BUFFER) {
  60.             FreeSplMem(ptr_info);
  61.             return NULL;
  62.         }
  63.         /**
  64.             Reallocate the buffer and re-try (note that, because we
  65.             allocated the buffer as LMEM_FIXED, the LMEM_MOVABLE does
  66.             not return a movable allocation, it just allows realloc
  67.             to return a different pointer.
  68.         **/
  69.         alloc_size = reqbytes + 10;
  70.         ptr_info = ReallocSplMem(ptr_info, alloc_size, 0);
  71.     } /* While re-trying */
  72.     if (ptr_info) {
  73.         FreeSplMem(ptr_info);
  74.     }
  75.     *pErrorCode = ERROR_NOT_ENOUGH_MEMORY;
  76.     return NULL;
  77. }