Envío de datos sin procesar a una impresora mediante la API win32

En este artículo se presenta cómo enviar datos sin procesar a una impresora mediante la API win32.

Versión original del producto: Windows API
Número de KB original: 138594

Resumen

A veces es necesario enviar datos específicos de la impresora directamente a una impresora, omitiendo el controlador. La API win32 proporciona un método que funciona en impresoras locales y en red. Este método se puede usar para reemplazar los PASSTHROUGH métodos de escape y SpoolFile() que se usan en versiones anteriores de la API de Windows.

Ejemplo de código

Puede usar el código siguiente para enviar datos sin procesar directamente a una impresora en Windows NT o Windows 95.

// RawDataToPrinter - sends binary data directly to a printer
// Params:
//   szPrinterName - NULL terminated string specifying printer name
//   lpData        - Pointer to raw data bytes
//   dwCount       - Length of lpData in bytes
// Returns: TRUE for success, FALSE for failure.
BOOL RawDataToPrinter(LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount)
{
    HANDLE     hPrinter;
    DOC_INFO_1 DocInfo;
    DWORD      dwJob;
    DWORD      dwBytesWritten;

    // Need a handle to the printer.
    if(!OpenPrinter( szPrinterName, &hPrinter, NULL))
    return FALSE;

    // Fill in the structure with info about this "document."
    DocInfo.pDocName = "My Document";
    DocInfo.pOutputFile = NULL;
    DocInfo.pDatatype = "RAW";
    // Inform the spooler the document is beginning.
    if((dwJob = StartDocPrinter(hPrinter, 1, (LPSTR)&DocInfo)) == 0)
    {
      ClosePrinter(hPrinter);
      return FALSE;
    }
    // Start a page.
    if(!StartPagePrinter(hPrinter))
    {
      EndDocPrinter(hPrinter);
      ClosePrinter(hPrinter);
      return FALSE;
    }
    // Send the data to the printer.
    if(!WritePrinter(hPrinter, lpData, dwCount, &dwBytesWritten))
    {
      EndPagePrinter(hPrinter);
      EndDocPrinter(hPrinter);
      ClosePrinter(hPrinter);
      return FALSE;
    }
    // End the page.
    if(!EndPagePrinter(hPrinter))
    {
      EndDocPrinter(hPrinter);
      ClosePrinter(hPrinter);
      return FALSE;
    }
    // Inform the spooler that the document is ending.
    if(!EndDocPrinter(hPrinter))
    {
      ClosePrinter(hPrinter);
      return FALSE;
    }
    // Tidy up the printer handle.
    ClosePrinter(hPrinter);
    // Check to see if correct number of bytes were written.
    if(dwBytesWritten != dwCount)
      return FALSE;
      return TRUE;
}

El siguiente archivo está disponible para su descarga desde el Centro de descarga de Microsoft:

RAWPRN.EXE

Para obtener más información sobre cómo descargar archivos Soporte técnico de Microsoft, consulte Obtención de archivos de soporte técnico de Microsoft de servicios en línea.

Microsoft ha examinado este archivo en busca de virus. Microsoft usó el software de detección de virus más actual que estaba disponible en la fecha en que se publicó el archivo. El archivo se almacena en servidores mejorados de seguridad que ayudan a evitar cambios no autorizados en el archivo.