0

I'm writing a program which reads from file and send to printer to print.

I set "HP Laser Jet 4" as default printer and checked "LPT1" in printer properties of "HP Laser Jet 4". Print spooler is also running (Windows 7).

The problem is hPort always returns INVALID_HANDLE_VALUE.

I don't have a real printer. Is it a problem?

#include "stdafx.h"
#include <windows.h>

int main()
{
    HANDLE hPort = CreateFile(_T("LPT1:"), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hPort != INVALID_HANDLE_VALUE) {
        printf("success");
    } else {
        printf("%i", GetLastError());
    }    
    return 0;
}
4

2 回答 2

3

为什么你尝试打开 LPT 端口。你真的需要这个吗?如果打印机(例如 HP Laser Jet 4 或任何其他)安装在操作系统中并且您想直接写入而不使用打印机驱动程序,您可以写入数据(例如从文件),如下所示:

TCHAR *pPrinterName = TEXT("HP Laser Jet 4");
TCHAR *pFileName = TEXT("c:\filename.prn");
HANDLE hPrinter = NULL;
DOC_INFO_1 docinfo;
FILE *pfile = NULL;
DWORD dwBytesWritten = 0L;
BYTE data[1024];
DWORD dwCount = 0L;

if (OpenPrinter(pPrinterName, &hPrinter, NULL))
{
  docinfo.pDocName = TEXT("RAW Output Document Name");
  docinfo.pOutputFile = NULL;
  docinfo.pDatatype = TEXT("RAW");

  DWORD dwPrtJob = StartDocPrinter(hPrinter, 1, (LPBYTE)&docinfo);

  if (dwPrtJob > 0)
  {
    if (0 == _tfopen_s(&pfile, pFileName, TEXT("rb")))
    {
      while (!feof(pfile))
      {
        dwCount = (DWORD)fread(&data, 1, 1024, pfile);
        WritePrinter(hPrinter, &data, dwCount, &dwBytesWritten);
      }
      fclose(pfile);
    }
  }
  EndDocPrinter(hPrinter);
  ClosePrinter(hPrinter);
}

可能是,这段代码有一些错误。我不测试它。我只是从我的一个旧项目中删除它。

以同样的方式,您可以将文件(包含打印机命令 - 例如 HP PCL5/PCL6 打印机的 PCL/PJL)发送到任何打印机/端口。

于 2011-04-01T06:48:36.820 回答
0

问题是 hPort 总是返回 INVALID_HANDLE_VALUE。

我没有真正的打印机。这是个问题吗?

这是一个问题,如果您没有真正的 LPT1 (LPT2...) 端口,但没有安装打印机设备或打印机驱动程序。

检查设备管理器或 PC 硬件,如果 LPT1 端口确实存在。

对于真正呈现的 LPT1 端口,您的代码必须返回“成功”

如果 LPT1 没有真正出现在您的 PC 中,您的代码 ( GetLastError() ) 必须返回 2 ( ERROR_FILE_NOT_FOUND )。

于 2011-04-01T07:45:03.107 回答