代码之家  ›  专栏  ›  技术社区  ›  Kevin Day

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

  •  3
  • Kevin Day  · 技术社区  · 17 年前

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

    我认为我需要使用 XcvData 和 XcvDataPort 功能可以做到这一点,但我有点不知道该怎么做。

    有人有关于如何进行的例子或建议吗?

    我想我需要做以下事情:

    1. 检查以确保端口名不存在(我可能可以使用 EnumPorts

    2 回复  |  直到 17 年前
        1
  •  2
  •   Kevin Day    17 年前

    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;
    }
    

    在给定的打印机上设置端口相对简单-OpenPrint()、使用printer_INFO_2的GetPrinter()、SetPrinter()、ClosePrint()

    再见。

        2
  •  0
  •   Gabriel Devillers    8 年前

    https://learn.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结构中的第一个元素。也许这就是为什么你的代码没有失败,尽管它是错误的。