好像是微软官方的支持给出了VC#的解决办法,可以运行,也不报错,就是没啥反应啊!
基本调用函数过程是:二进制文件,
OpenPrinter-->StartDocPrinter-->StartPagePrinter-->WritePrinter-->EndPagePrinter-->EndDocPrinter-->ClosePrinter
各函数的解释:
OpenPrinter:
OpenPrinter函数获取一个句柄到指定的打印机或打印服务器或打印子系统中其他类型的句柄。
BOOL OpenPrinter(
LPTSTR pPrinterName, // printer or server name
LPHANDLE phPrinter, // printer or server handle
LPPRINTER_DEFAULTS pDefault // printer defaults
);
参数:
pPrinterName:[输入参数]非空字符串,表示打印机名称;
phPrinter:[输出]接收打开的打印机的句柄;
pDefault:[输入】PRINTER_DEFAULTS结构的指针。此值可以为NULL。
返回值:
如果函数成功,返回值是一个非零值;如果函数失败,返回值是零。调用GetLastError获得更多错误信息。
备注:
不要在DllMain中调用此方法;非线程安全的,多线程操作要做同步。
StartDocPrinter
StartDocPrinter函数通知spooler一个文件已经spooled for printing。
DWORD StartDocPrinter(
HANDLE hPrinter, // handle to printer object
DWORD Level, // information level
LPBYTE pDocInfo // information buffer
);
参数
hPrinter:打印机句柄;
Level:指定版本的结构,pDocInfo指向的这个结构;在Windows NT/2000/XP中此值必须是1,在Windows 95/98/Me中,这个值可以是1或2;
pDocInfo:一个结构的指针,描述要打印的文件。Windows NT/2000/XP中pDocInfo是到DOC_INFO_1结构的指针;在Windows 95/98/Me,pDocInfo是一个DOC_INFO_1或DOC_INFO_2结构的指针。
DOC_INFO_1结构为:
typedef struct _DOC_INFO_1 {
LPTSTR pDocName;
LPTSTR pOutputFile;
LPTSTR pDatatype;
} DOC_INFO_1;
StartPagePrinter:通知spooler一个页面将在指定的打印机上打印。
WritePrinter:
WritePrinter函数通知splooer数据应该被写入到指定的打印机。
BOOL WritePrinter(
HANDLE hPrinter, // handle to printer object
LPVOID pBuf, // array of printer data
DWORD cbBuf, // size of array
LPDWORD pcWritten // bytes written to printer
);
参数:
hPrinter:[输入]打印机句柄;
PBUF:[输入]一个字节数组的指针,其中包含应写入到打印机的数据。
cbBuf:[输入]数组的大小,以字节为单位。
pcWritten:[输出]值的指针,存放写入打印机的数组长度。