2009-08-25 48 views
3

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

我相信我需要使用XcvData和/或XcvDataPort函数来做到这一点,但我在如何处理方面存在一些损失。

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

我想像,我需要做到以下几点:

  1. 检查,以确保端口名称不存在(我大概可以使用EnumPorts这一点,但我不知道那是最好的办法给我也必须创建端口)
  2. 创建的端口名称,如果它确实存在
  3. 更改打印机配置为使用新的端口

和卸载:

  • 删除端口
  • 回答

    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(),GetPrinter()与PRINTER_INFO_2,SetPrinter(),ClosePrinter()

    Cheerio。

    相关问题