2009-08-25 322 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。

    相關問題