How to create a new port and assign it to a printer

后端 未结 2 1951
名媛妹妹
名媛妹妹 2021-01-14 16:56

We have a virtual printer (provided by a 3rd party) that is getting assigned to an invalid local printer port. The printer is always local (we aren\'t dealing with a remote

2条回答
  •  长情又很酷
    2021-01-14 17:37

    Wow, looks like that one stumped everyone... After much digging, here's how to do it:

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

    Setting the port on a given printer is relatively straight forward - OpenPrinter(), GetPrinter() with PRINTER_INFO_2, SetPrinter(), ClosePrinter()

    Cheerio.

提交回复
热议问题