如何创建新端口并将其分配给打印机

时间:2009-08-25 00:32:08

标签: c++ winapi driver printing

我们有一台虚拟打印机(由第三方提供),它被分配到无效的本地打印机端口。打印机始终是本地的(我们不处理远程打印服务器或类似的东西)。我想创建一个新的本地端口(特定于我们的应用程序),然后将打印机配置为分配给该端口,而不是打印驱动程序安装程序选择的随机(通常是不正确的)端口。

我认为我需要使用XcvData和/或XcvDataPort函数来执行此操作,但我对如何使用感到有点失落。

有没有人有关于如何进行的任何示例或指示?

我想我需要做以下事情:

  1. 检查以确保端口名称尚不存在(我可能会使用EnumPorts,但我不确定这是最好的方法,因为我还必须创建端口)
  2. 创建端口名称(如果存在)
  3. 更改打印机配置以使用新端口
  4. 和卸载:

    1. 删除端口

2 个答案:

答案 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结构中的第一个元素。也许这就是为什么您的代码没有失败的原因,尽管它是错误的。