Compartir a través de


Instalación de un procesador de impresión

Para instalar un procesador de impresión, una aplicación de instalación debe llamar a la función AddPrintProcessor del administrador de colas. Para asociar un procesador de impresión a una cola de impresión, enumere su nombre de archivo en un archivo INF en una entrada PrintProcessor. Esta entrada debe incluirse para cada cola de impresión a la que se va a asociar el procesador de impresión. Para obtener más información, consulte Archivos INF de impresora.

Cuando una aplicación de instalación llama a la función AddPrinter del administrador de colas, con una estructura {PRINTER_INFO_2](/windows/win32/printdocs/printer-info-2) como argumento de entrada, especifica el nombre del procesador de impresión (obtenido del archivo INF) como miembro de estructura.

Asociación de un procesador de impresión con una cola de impresión instalada por pnp

Si el administrador de Plug and Play (PnP) detecta e instala una cola de impresión en un sistema que ejecuta Windows 2000 o Windows XP, y si el archivo INF usado para instalar la cola de impresión contiene una entrada PrintProcessor distinta del procesador de impresión predeterminado de Windows, WinPrint, el procesador de impresión no se asociará con la cola de impresión. Sin embargo, se instalará el procesador de impresión.

Tenga en cuenta que si instala la cola de impresión mediante el Asistente para agregar impresoras, el procesador de impresión se asocia correctamente a la cola de impresión.

Tenga en cuenta también que el administrador de PnP en Microsoft Windows Server 2003 y versiones posteriores asocia correctamente un procesador de impresión a la cola de impresión.

Para asociar el procesador de impresión a la cola de impresión para las instalaciones de Plug and Play en Windows 2000 y Windows XP, incluya un caso PRINTER_EVENT_INITIALIZE en la función DrvPrinterEvent de la interfaz de impresora DLL. Para Microsoft Windows Server 2003 y versiones posteriores, no es necesario agregar un PRINTER_EVENT_INITIALIZE caso en la función DrvPrinterEvent .

En el ejemplo de código siguiente se establece el miembro pPrintProcessor de la estructura PRINTER_INFO_2 en el nombre del procesador de impresión y, a continuación, se llama a la función SetPrinter para actualizar la configuración de la impresora. Tenga en cuenta que el nombre del procesador de impresión en gszPrintProc debe ser el mismo que en la entrada PrintProcessor del archivo INF.

BOOL
DrvPrinterEvent(
               LPWSTR  pPrinterName,
               INT     Event,
               DWORD   Flags,
               LPARAM  lParam
               )

{
  PRINTER_DEFAULTS  PrinterDef = {NULL, NULL, PRINTER_ALL_ACCESS};
  HANDLE            hPrinter;
  LPPRINTER_INFO_2  pInfo = NULL;
  DWORD             cbNeeded;
  TCHAR             gszPrintProc[] = TEXT("<Print processor name>");
  BOOL              bRet = TRUE;

  switch (Event)
  {
    case PRINTER_EVENT_INITIALIZE:
      if (OpenPrinter(pPrinterName, &hPrinter, &PrinterDef))
      {
        if ( !GetPrinter( hPrinter, 2, (LPBYTE) pInfo, 0, &cbNeeded ) &&
           (GetLastError() != ERROR_INSUFFICIENT_BUFFER) )
        {
          bRet = FALSE;
        }
        if (bRet == TRUE)
        {
          pInfo = (LPPRINTER_INFO_2) LocalAlloc(LPTR, cbNeeded);
          bRet = pInfo ? TRUE : FALSE;
        }
        if (bRet == TRUE)
        {
          if (GetPrinter(hPrinter, 2, (LPBYTE) pInfo, cbNeeded, &cbNeeded))
          {
            pInfo->pPrintProcessor = gszPrintProc;
            SetPrinter(hPrinter, 2, (LPBYTE) pInfo, 0);
          }
          else 
          {
            bRet = FALSE;
          }
          if (pInfo)
          {
            LocalFree(pInfo);
          }
        }
        ClosePrinter(hPrinter);
      }
      else  // OpenPrinter failed
      {
        bRet = FALSE;
      }
    break;
    // cases for other events

    default:
      break;
  }  // end switch
  return bRet;
}

Asociación de un procesador de impresión con una cola de impresión durante la actualización del controlador de impresora

Cuando se actualiza un controlador de impresora, no se cambia el procesador de impresión de la cola de impresión actualizada. Si el nuevo controlador de impresora requiere un procesador de impresión determinado, la función DrvUpgradePrinter de la interfaz de impresora debe establecer el miembro pPrintProcessor de la estructura PRINTER_INFO_2 en el nombre del nuevo procesador de impresión. Después de esto, esta función llama a SetPrinter para actualizar la configuración de la impresora. El colador llama a la función DrvUpgradePrinter una vez para cada impresora, lo que garantiza que todas las impresoras que usen ese controlador también usen el procesador de impresión necesario. En el ejemplo de código siguiente se muestran estos puntos.

BOOL
DrvUpgradePrinter(
                 DWORD   Level,
                 LPBYTE  pDriverUpgradeInfo
                 )
{
  HANDLE                  hPrinter;
  PRINTER_DEFAULTS        PrinterDef = {NULL, NULL, PRINTER_ALL_ACCESS};
 PDRIVER_UPGRADE_INFO_2  pDUI2;
  LPPRINTER_INFO_2        pInfo = NULL;
 DWORD                   cbNeeded;
  TCHAR                   gszPrintProc[]   = TEXT("<Print processor name>");
  TCHAR                   gszPrintDriver[] = TEXT("<Printer driver name>");
  BOOL                    bRet = TRUE;

  if ((Level == 2)                                            &&
      (pDUI2 = (PDRIVER_UPGRADE_INFO_2)pDriverUpgradeInfo)    &&
      (OpenPrinter(pDUI2->pPrinterName, &hPrinter, &PrinterDef)))
  {
    if ( !GetPrinter( hPrinter, 2, (LPBYTE) pInfo, 0, &cbNeeded )  &&
         (GetLastError() != ERROR_INSUFFICIENT_BUFFER) )
    {
       bRet = FALSE;
    }
    if (bRet == TRUE)
    {
      pInfo = (LPPRINTER_INFO_2) LocalAlloc(LPTR, cbNeeded);
      bRet = pInfo ? TRUE : FALSE;
    }
    if (bRet == TRUE)
    {
      if (GetPrinter(hPrinter, 2, (LPBYTE) pInfo, cbNeeded, &cbNeeded))
      {
      //
      // This function is called for every printer queue that uses a driver
      // for which one or more files were updated. However, we only want to
      // update the printer queue's "driver" by a particular driver.
      //
      if ( !lstrcmpi(pInfo->pDriverName, gszPrintDriver) )
      {
        pInfo->pPrintProcessor =  gszPrintProc;
        SetPrinter(hPrinter, 2, (LPBYTE) pInfo, 0);
      }
    else  // GetPrinter 
    {
      bRet = FALSE;
    }
    if (pInfo)
    {
      LocalFree(pInfo);
    }
    ClosePrinter(hPrinter);
  }
  else  // Level != 2 or pDUI2 == NULL or OpenPrinter failed
  {
    bRet = FALSE;
  }
  return bRet;
}