2009-08-25 8 views
3

Nous avons une imprimante virtuelle (fournie par un tiers) qui est affectée à un port d'imprimante local non valide. L'imprimante est toujours locale (nous n'avons pas affaire à un serveur d'impression distant ou quelque chose comme ça). Je souhaite créer un nouveau port local (spécifique à notre application), puis configurer l'imprimante à affecter à ce port au lieu du port aléatoire (et souvent incorrect) choisi par le programme d'installation du pilote d'impression. Je crois que j'ai besoin d'utiliser les fonctions XcvData et/ou XcvDataPort pour ce faire, mais je suis un peu en perte de vitesse.Comment créer un nouveau port et l'affecter à une imprimante

Quelqu'un at-il des exemples ou des indications sur la façon de procéder?

J'imagine que je dois faire ce qui suit:

  1. vérifierons le nom du port n'existe pas déjà (je peux probablement utiliser EnumPorts pour cela, mais je ne suis pas sûr que ce soit meilleure approche étant donné que je dois créer aussi des ports)
  2. créer le nom du port si elle existe
  3. Modifier la configuration de l'imprimante pour utiliser le nouveau port

et désinstallation:

  1. Retirez le port

Répondre

2

Wow, on dirait que tout le monde un ... déconcerté Après beaucoup de creuser, voici comment faire:

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

La définition du port sur une imprimante donnée est relativement simple - OpenPrinter(), GetPrinter() avec PRINTER_INFO_2, SetPrinter(), ClosePrinter()

Cheerio.

Questions connexes