2011-04-01 146 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)返回 「成功」