2011-04-01 142 views
0

我正在编写一个程序,它从文件读取并发送到打印机进行打印。无法从LPT1获取端口句柄

我将“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; 
} 

回答

3

为什么你试着打开LPT端口。这真的是需要你吗? 如果打印机(如HP激光喷墨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)发送到任何打印机/端口。

+0

你的“filename.prn”文件的格式是什么?它只是ASCII字符串或任何特定的格式? – Felix 2014-09-13 11:22:08

+0

@Fei此代码可用于向连接到任何端口类型(LPT,COM,USB,网络...)的打印机发送任何文件(文本,二进制文件)。如果需要使用某些格式打印页面(粗体..你需要提供命令PCL,ESC/P ...(换句话说,你必须执行打印机驱动程序的工作)。 – 2014-09-19 12:11:53

0

问题是hPort总是返回INVALID_HANDLE_VALUE。

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

如果您没有真正的LPT1(LPT2 ...)端口,但没有安装打印机设备或打印机驱动程序,则会出现此问题。

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

对于真正呈现LPT1端口,您的代码必须如果LPT1并没有真正在您的PC呈现你的代码(GetLastError函数())必须返回2(ERROR_FILE_NOT_FOUND)返回 “成功”