HDC GetPrinterDC (void)
{
      DWORD             dwNeeded, dwReturned ;
      HDC               hdc ;
      PRINTER_INFO_4 *  pinfo4 ;
      PRINTER_INFO_5 *  pinfo5 ;       if (GetVersion () & 0x80000000)      // Windows 98
      {
           EnumPrinters (PRINTER_ENUM_DEFAULT, NULL, 5, NULL,
                    0, &dwNeeded, &dwReturned) ;
           pinfo5 = malloc (dwNeeded) ;
           EnumPrinters (PRINTER_ENUM_DEFAULT, NULL, 5, (PBYTE) pinfo5,
                    dwNeeded, &dwNeeded, &dwReturned) ;
           hdc = CreateDC (NULL, pinfo5->pPrinterName, NULL, NULL) ;
           free (pinfo5) ;
      }
      else
//Windows NT
     {
           EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, NULL,
                    0, &dwNeeded, &dwReturned) ;
           pinfo4 = malloc (dwNeeded) ;
           EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, (PBYTE) pinfo4,
                    dwNeeded, &dwNeeded, &dwReturned) ;
           hdc = CreateDC (NULL, pinfo4->pPrinterName, NULL, NULL) ;
           free (pinfo4) ;
      }
      return hdc ;   
}

解决方案 »

  1.   

    也不知对不对
    好像编译没什么问题
    其实很多工作priters里已经做了。
    use  winspool;function getprtDc: integer;
    var
      dwNeeded, dwReturned: DWORD;
      hdc1: HDC;
      pinfo4: PPrinterInfo4;
      pinfo5: PPRINTERINFO5;
    begin
      if (GetVersion() and $80000000) = 0 then // Windows 98
      begin
        EnumPrinters(PRINTER_ENUM_DEFAULT, nil, 5, nil,
          0, dwNeeded, dwReturned);
        GetMem(pinfo5, dwNeeded);
        EnumPrinters(PRINTER_ENUM_DEFAULT, nil, 5, pinfo5,
          dwNeeded, dwNeeded, dwReturned);
        hdc1 := CreateDC(nil, pinfo5^.pPrinterName, nil, nil);
        freemem(pinfo5);
      end
      else
    //Windows NT
      begin
        EnumPrinters(PRINTER_ENUM_LOCAL, nil, 4, nil,
          0, dwNeeded, dwReturned);
        getmem(pinfo4, dwNeeded);
        EnumPrinters(PRINTER_ENUM_LOCAL, nil, 4, pinfo4,
          dwNeeded, dwNeeded, dwReturned);
        hdc1 := CreateDC(nil, pinfo4^.pPrinterName, nil, nil);
        freemem(pinfo4);
      end;
      Result := hdc1;end;