2016-01-21 1 views
2

Je suis confronté à un comportement étrange - il semble qu'il est impossible d'enumérer des résolutions pour les imprimantes à encre Epson dans Windows. en particulier ce code signale toujours l'erreur:Appel WinAPI à DeviceCapabilities (DC_ENUMRESOLUTIONS) pour Epson P50 signaler toujours l'erreur

int r, err; 
char szBuffer[0x4000]; 
String prnName = "EPSON P50 Series"; 
String portName = "USB002"; 

r = DeviceCapabilities(prnName.c_str(), portName.c_str(), DC_ENUMRESOLUTIONS, NULL, NULL); 
err = GetLastError(); 
printf("\n 1.DevCap.result = %d, err = %d", r, err); 

r = DeviceCapabilities(prnName.c_str(), portName.c_str(), DC_ENUMRESOLUTIONS, szBuffer, NULL); 
err = GetLastError(); 
printf("\n 2.DevCap.result = %d, err = %d", r, err); 

En sortie, je vois ce qui suit:

1.DevCap.result = -1, err = 0 
2.DevCap.result = -1, err = 13 

Note: erreur de Windows 13 est ERROR_INVALID_DATA.

Pourriez-vous s'il vous plaît m'aider à comprendre - comment interpréter cela correctement? Cela signifie-t-il que les pilotes des imprimantes à encre Epson ne fournissent aucune information sur les résolutions d'impression prises en charge? Ou y a-t-il vraiment des paramètres invalides? Si oui, lequel pourrait-il être?

Merci d'avance.

PS. Veuillez noter les points suivants:

1) Les noms d'imprimante et de port sont corrects. Ils sont obtaines avec l'appel WinAPI EnumPrinters(). Dans cet exemple de code, je coupe tout code non pertinent, donc ne gardez que les fonctions qui échouent.

2) L'imprimante elle-même fonctionne correctement, je peux y imprimer des documents et des photos.

3) J'ai également ajouté une imprimante "Epson Stylus 300" qui est configurée pour utiliser le port "FILE:" pour l'impression. Et la chose intéressante - un appel à DeviceCapabilities(DC_ENUMRESOLUTIONS) pour une telle imprimante signale également erreur 13. C'est pourquoi je incline à penser que toutes les imprimantes à encre Epson ne fournissent aucune information sur la résolution d'impression ...

4) Tous les autres appels à DeviceCapabilities() fonction (pour DC_PAPERS, DC_PAPERSIZE, DC_PAPERNAMES, etc) fonctionne très bien pour ces imprimantes (Epson P50 et Epson Stylus 300). Ainsi, le nom de l'imprimante et le nom du port sont corrects, le problème n'existe que pour l'appel DeviceCapabilities(DC_ENUMRESOLUTIONS).

+0

Il devrait être simple. Très probablement, ces deux imprimantes ne prennent pas en charge l'indicateur 'DC_ENUMRESOLUTIONS'. Installez une imprimante d'une autre société, cela fonctionnera probablement. –

+0

Oui, je sais que cela fonctionne pour d'autres imprimantes. Ce logiciel a fonctionné pendant des années, seulement maintenant quand j'essaye d'imprimer à Epson j'ai eu ce problème. Je suis juste un peu perplexe que l'imprimante ne fournit pas la liste des résolutions prises en charge et ce que cela signifie pour moi? Puis-je spécifier résolution = 12345 alors et s'attendre à voir l'impression correcte? –

Répondre

1

Cela semble être une erreur avec les imprimantes Epson. Cependant, les valeurs de résolution dépendent du périphérique et vous ne devriez pas en avoir besoin de toute façon.

Vous pouvez obtenir une résolution de l'imprimante par DEVMODE et un rapport juste à l'utilisateur:

PRINTDLG pdlg = { sizeof PRINTDLG }; 
pdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC; 
PrintDlg(&pdlg); 

DEVMODE* dm = (DEVMODE*)::GlobalLock(pdlg.hDevMode); 
cout << "dm->dmDeviceName: " << dm->dmDeviceName << endl; 

if (dm->dmFields & DM_PRINTQUALITY) 
{ 
    cout << "dm->dmPrintQuality: " << dm->dmPrintQuality << endl; 
} 

::GlobalUnlock(pdlg.hDevMode); 

dmPrintQuality est soit la résolution de l'imprimante ou l'un de ces périphériques valeurs indépendantes:

#define DMRES_DRAFT   (-1) 
#define DMRES_LOW   (-2) 
#define DMRES_MEDIUM  (-3) 
#define DMRES_HIGH   (-4) 

Si l'utilisateur veut changer cette valeur, il est préférable de donner accès à la boîte de dialogue d'installation de l'imprimante.

1

J'ai confirmé le problème avec une série EPSON Stylus Photo RX595. Barmak Shenmirani est correct que le champ dmPrintQuality du DEVMODE indiquera l'une des constantes négatives pour donner une idée approximative de la résolution ou une valeur positive en pixels par pouce pour la résolution horizontale. Dans ce dernier cas, vous pouvez obtenir la résolution verticale à partir du champ dmYResolution du DEVMODE.

Si vous avez utilisé EnumPrinters avec le niveau 2 (PRINTER_INFO_2) pour obtenir le nom et le port, alors vous avez déjà une copie de la valeur par défaut DEVMODE.

Il semble raisonnable de supposer que toute imprimante qui échoue DC_ENUMRESOLUTIONS a une seule résolution, et c'est la résolution par défaut DEVMODE. Vous pourriez essayer d'ouvrir la boîte de dialogue d'impression et peaufiner les différents boutons de qualité qu'il offre pour voir si la résolution est différente dans le résultat DEVMODE, mais je doute que cela va changer.

Dans le cas de mon imprimante, il semble que la résolution 360 × 360 pixels par pouce rapporté dans le DEVMODE est une valeur abstraite puisque les caractéristiques de la revendication de l'imprimante « 5760 × 1440 ppp optimisés ». Vraisemblablement, le pilote dithers tous ces points pour atteindre une densité effective de 360 ​​pixels.

Pour vous assurer que ce n'était pas seulement une erreur de codage de ma part, je l'ai couru aussi pour mon imprimante laser (un frère) et il fait état de deux résolutions: 600 × 600 et 300 × 300.

+0

J'ai besoin de connaître une résolution pour recalculer les images de codes à barres pour les imprimer dans la bonne taille. Mais comme je peux le voir - je peux spécifier presque n'importe quelle résolution - comme 300 ou 600 - semble que cela fonctionne très bien pour mon Epson P50. Bien sûr, ce n'est pas un objectif d'imprimer des codes à barres tout le temps sur P50, j'avais seulement besoin de matériel réel pour tester notre logiciel. P50 était seulement l'option près de moi ... –

+1

Les imprimantes à haute résolution feront probablement un bon travail avec une source de toute résolution raisonnable. –