我们有一台虚拟打印机(由第三方提供),它被分配到无效的本地打印机端口。打印机始终是本地的(我们不处理远程打印服务器或类似的东西)。我想创建一个新的本地端口(特定于我们的应用程序),然后将打印机配置为分配给该端口,而不是打印驱动程序安装程序选择的随机(通常是不正确的)端口。
我认为我需要使用XcvData和/或XcvDataPort函数来执行此操作,但我对如何使用感到有点失落。
有没有人有关于如何进行的任何示例或指示?
我想我需要做以下事情:
和卸载:
答案 0 :(得分:2)
DWORD CreatePort(LPWSTR portName)
{
HANDLE hPrinter;
PRINTER_DEFAULTS PrinterDefaults;
memset(&PrinterDefaults, 0, sizeof(PrinterDefaults));
PrinterDefaults.pDatatype = NULL;
PrinterDefaults.pDevMode = NULL;
PrinterDefaults.DesiredAccess = SERVER_ACCESS_ADMINISTER;
DWORD needed;
DWORD rslt;
if (!OpenPrinter(",XcvMonitor Local Port", &hPrinter, &PrinterDefaults))
return -1;
DWORD xcvresult= 0;
if (!XcvData(hPrinter, L"AddPort", (BYTE *)portName, (lstrlenW(portName) + 1)*2, NULL, 0, &needed, &xcvresult))
rslt= GetLastError();
if (!ClosePrinter(hPrinter))
rslt= GetLastError();
return rslt;
}
在给定打印机上设置端口相对简单 - OpenPrinter(),带PRINTER_INFO_2的GetPrinter(),SetPrinter(),ClosePrinter()
Cheerio。
答案 1 :(得分:0)
我想您的代码只是偶然地起作用。根据 https://docs.microsoft.com/en-us/windows-hardware/drivers/print/tcpmon-xcv-commands(根据我自己的经验),真正的解决方案是:
PORT_DATA_1 pdPortData;
wcscpy_s(pdPortData.sztPortName, MAX_PORTNAME_LEN, lpPortName);
[...]
if (!XcvData(hXcv, L"AddPort", (BYTE*) &pdPortData, sizeof(PORT_DATA_1), NULL, 0, &dwNeeded, &dwStatus))
[...]
sztPortName是PORT_DATA_1结构中的第一个元素。也许这就是为什么您的代码没有失败的原因,尽管它是错误的。