无法从 LPT1 获取端口句柄

标签 c winapi createfile printers lpt

我正在编写一个从文件中读取并发送到打印机进行打印的程序。

我将“HP Laser Jet 4”设置为默认打印机,并在“HP Laser Jet 4”的打印机属性中选中了“LPT1”。后台打印程序也在运行 (Windows 7)。

问题是 hPort 总是返回 INVALID_HANDLE_VALUE

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

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

最佳答案

为什么要尝试打开 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)发送到任何打印机/端口。

关于无法从 LPT1 获取端口句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5508814/

相关文章:

c - 指针声明的区别?

c++ - Windows 的 timespec 等价物

c++ - 使用 SetWindowSubclass 在自定义类中子类化按钮

c++ - GDIplus闪烁

c - 如何检查文件是否已在 Windows 的 CreateFile 函数中打开

c++ - 为什么虚拟内存地址在不同的进程中是相同的?

c++ - 为什么我在字符串和 vector 上得到两个不同的结果

windows - 如何区分空窗口文本和 GetWindowText API 错误?

c - 使用 native Win32 读取 'C' 中的文本文件 (Unicode)

c++ - 创建文件和内存管理