2010-02-13 66 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); 

希望这有助于 最好的问候, 汤姆。