我正在编写一个程序,它从文件中读取并发送到打印机进行打印。
我将“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;
}
答案 0 :(得分: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)发送到任何打印机/端口。
答案 1 :(得分:0)
问题是hPort总是返回INVALID_HANDLE_VALUE。
我没有真正的打印机。这是一个问题吗?
如果您没有真正的LPT1(LPT2 ...)端口,但没有安装打印机设备或打印机驱动程序,则会出现此问题。
如果确实存在LPT1端口,请检入设备管理器或PC硬件。
对于真正呈现的LPT1端口,您的代码必须返回“success”
如果您的PC中没有真正显示LPT1,则代码(GetLastError())必须返回2(ERROR_FILE_NOT_FOUND)。