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;
}