2010-02-13 45 views
2

我使用C. VC++ 2008年速成版當我嘗試運行此:如何使打印機在MS VC++ Express版C中工作?

/* Demonstrates printer output. */ 

#include <stdio.h> 

main() 
{ 
float f = 2.0134; 

fprintf(stdprn, "This message is printed.\n\n"); 
fprintf(stdprn, "And now some numbers:\n\n"); 
fprintf(stdprn, "The square of %f is %f.", f, f*f); 

/* Send a form feed */ 

fprintf(stdprn, "\f"); 
} 

我得到這些錯誤四:錯誤C2065:STDPRN「:未聲明的標識符。

this論壇上,他們寫道,它的作品來定義打印機如下:

FILE *printer; 
printer = fopen("PRN", "w"); 

編輯 它建立與的fopen是不安全的警告。當它運行時出現錯誤:

調試斷言失敗。 文件:F:\ DD \ vctools \ crt_bld \ self_x86 \ CRT \ SRC \ fprintf.c 行:55

表達式:(!STR = NULL)

回答

1

stdprn流是擴展由Borland提供編譯器 - 據我所知,MS從來不支持它。關於使用fopen打開打印機設備,我不認爲這將與最近的任何版本的Windows上運行,但幾件事情嘗試:

  • 使用PRN:的名稱,而不是PRN(注冒號)
  • 嘗試使用(例如)LPT1:(再次注意冒號)打開特定設備。如果您沒有連接打印機,這當然不起作用。
  • 不依賴於打印機對話框 - 當你採用這種方法時,你並沒有真正使用WIndows打印系統(所以它可能不會解決你的問題,但值得一試)。
1

我沒有做一臺打印機連接,但我已經安裝了微軟的XPS文檔作家,S它shoulod至少彈出標準的Windows打印對話框從中可以選擇打印機。

不,它不會展開對話。這是因爲您正在將數據刷新到文件。而不是通過迂迴的Win32 API。

打印不起作用,因爲數據不正確PDL - 打印機可以理解的東西。爲了使打印工作正常,您需要推入PDL文件,並使用特定於語言的結構。這從打印機到打印機而異,PS打印機需要您推入PostScript片段,PCL - PCL命令集,而在MXDW的情況下,您將不得不編寫基於XML的頁面描述標記並創建一個zip文件(包含所有資源),即XPS文件以獲得正確的打印輸出。

PDL結構非常重要,因爲否則打印機不知道將數據放在哪裏,打印哪種顏色,使用什麼樣的方向,打印多少份等,等等。

編輯:我很好奇你爲什麼這樣做。我知道可移植性可能是您正在努力解決的問題。但除此之外,我想知道,可能有更好的選擇。 Win32 Print Subsytem如果您嘗試以任意程度的保真度在Windows上以編程方式進行打印,則應該查找API。

編輯#2:

編輯它建立與的fopen是不安全的警告。

這是因爲MS建議你現在使用更安全的版本fopen_s。請參閱Security Enhancements in the CRT

當它運行時錯誤出現:

Debug Assertion fails. File: f:\dd\vctools\crt_bld\self_x86\crt\src\fprintf.c Line: 55 Expression: (str != NULL)

這是因爲fopen(其返回值,你不檢查)返回NULL指針。該文件打開失敗。另外,如果它確實成功匹配fclose呼叫被呼叫。

0

在ANSI C中沒有stdprn這樣的東西,這是許多年前由某些編譯器提供的非標準擴展。 今天打印您必須使用您平臺上提供的特定API;要在Windows上打印,必須使用printing APIs管理文檔的打印並獲取打印機的DC,並使用GDI APIs執行DC上的實際繪圖。

在類UNIX的操作系統上,通常使用CUPS。

0

您也可以替換使用帶有net use此命令的打印機,在這裏看到的MSDN kb

 
NET USE LPT1 \\server_name\printer_name 

有在DOS打印的優良chapter使用BIOS,OK,它有點陳舊,但有趣的純粹是爲了懷舊的緣故。

爲了解決您的問題,您可能需要使用CreateFile來打開LPT1端口,請參閱here舉例,我將它複製到此處,爲您帶來好處。

 
HANDLE hFile; 

hFile = CreateFile("LPT1", GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); 

if (hFile == INVALID_HANDLE_VALUE) 
{ 
// handle error 
} 

OVERLAPPED ov = {}; 
ov.hEvent = CreateEvent(0, false, false, 0); 

char szData[] = "1234567890"; 
DWORD p; 

if (!WriteFile(hFile,szData, 10, &p, &ov)) 
{ 
if (GetLastError() != ERROR_IO_PENDING) 
{ 
// handle error 
} 
} 

// Wait for write op to complete (maximum 3 second) 
DWORD dwWait = WaitForSingleObject(ov.hEvent, 3000); 
if (dwWait == WAIT_TIMEOUT) 
{ 
// it took more than 3 seconds 
} else if (dwWait == WAIT_OBJECT_0) 
{ 
// the write op completed, 
// call GetOverlappedResult(...) 
} 

CloseHandle(ov.hEvent); 
CloseHandle(hFile); 

但是,如果你堅持要直接打開LPT1端口,省略錯誤檢查...

 
FILE *prn = fopen("lpt1", "w"); 
fprintf(prn, "Hello World\n\f"); 
fclose(prn); 

希望這有助於 最好的問候, 湯姆。

相關問題