我有一个后记文件。如何使用Visual C++将其发送到打印机?这似乎应该很简单。
HANDLE ph;
OpenPrinter(&ph, "Printer Name", NULL);
di1.pDatatype = IsV4Driver("Printer Name") ? "XPS_PASS" : "RAW";
di1.pDocName = "Raw print document";
di1.pOutputFile = NULL;
StartDocPrinter(ph, 1, (LPBYTE)&di1);
StartPagePrinter(ph);
WritePrinter(ph, buffer, dwRead, &dwWritten);
EndPagePrinter(ph);
EndDocPrinter(ph)
重复WritePrinter,直到整个文件都被缓冲。
IsV4Driver()检查版本4驱动程序,在Windows 8和Server 2012中是必需的:
bool IsV4Driver(wchar_t* printerName)
{
HANDLE handle;
PRINTER_DEFAULTS defaults;
defaults.DesiredAccess = PRINTER_ACCESS_USE;
defaults.pDatatype = L"RAW";
defaults.pDevMode = NULL;
if (::OpenPrinter(printerName, &handle, &defaults) == 0)
{
return false;
}
DWORD version = GetVersion(handle);
ClosePrinter(handle);
return version == 4;
}
DWORD GetVersion(HANDLE handle)
{
DWORD needed;
GetPrinterDriver(handle, NULL, 2, NULL, 0, &needed);
std::vector<char> buffer(needed);
return ((DRIVER_INFO_2*) &buffer[0])->cVersion;
}
EndDocPrinter
,但我非常确定第一个不应该存在。 - choweytelnet my.network.printer 9100 < pic.ps
)(我可能没有正确记住端口号,可能需要嗅探或进行一些研究)并写入该文件。lpt1:
作为文件名(例如copy pic.ps lpt1:
),这将使用该设备。并不难。你可以使用 LPD(行式打印机守护程序)协议与服务器通讯。该协议很简单,你可以阅读规范并亲自编写。
另一种方式是直接调用lpr
命令。不过,这个命令在Windows 7 中默认是禁用的。搜索“Windows 7 lpr 命令”会告诉你如何启用它。