bonjour à tous,
tout est dans le titre :D
merci
Version imprimable
bonjour à tous,
tout est dans le titre :D
merci
ben il y as peut être des méthode plus haut-niveau, mais si CreateFile échoue sur le port LPT1 tu peut en déduire que rien n'est connecté !!
salut,
voir fonction GetPrinter avec la structure d'infos PRINTER_INFO_2
il y a une variable status .
:D
:merci: :D
J'y suis presque: :aie:
Le OpenPrinter fonctionne, le handle semble correc, mais GetPrinter me renvoie: "erreur 6: descripteur non valide".Code:
1
2
3
4
5
6
7
8
9
10
11 HANDLE lpHandle; PRINTER_INFO_2 pi2; DWORD dwNeeded; if (0==OpenPrinter(NULL, &lpHandle, NULL)) { ReportLastError(); } if (0==GetPrinter(lpHandle, 2, (LPBYTE) &pi2, sizeof(PRINTER_INFO_2), &dwNeeded)) { ReportLastError(); }
Qu'entend-t-il par descripteur?
re,
la liberation est a ta charge ..Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 PRINTER_INFO_2 *GetInfosPrn(const char *szprn) { DWORD cbBuf=0; DWORD cbNeeded=1000; HANDLE hPrinter; PRINTER_INFO_2 *pInfos=NULL; // load printer driver if(OpenPrinter(szprn,&hPrinter,NULL)) { GetPrinter( hPrinter, // handle to printer of interest 2, // version of printer info data structure NULL, // pointer to array of bytes that receives printer info. structure cbBuf, // size, in bytes, of array of bytes &cbNeeded // pointer to variable with count of bytes retrieved (or required) ); cbBuf=cbNeeded; pInfos=(PRINTER_INFO_2 *)malloc(cbNeeded); if(pInfos) { if(GetPrinter(hPrinter,2,(LPBYTE)pInfos,cbBuf,&cbNeeded)) { } else { free(pInfos); ClosePrinter(hPrinter); return(NULL); } } ClosePrinter(hPrinter); } return(pInfos); }
:D
j'ai compris 2 choses:
- descripteur = handle
- il faut IMPERATIVEMENT passer le nom de l'imprimante à la fonction OpenPrinter().
Or, je voudrais juste savoir si une imprimante (quelconque) est connectée.
si le nom n'est pas passée (NULL) c'est l'imprimante locale qui est ouverte
:D
un detail connectée (ça veut dire installée) ou qu'il y a une imprimante sur le poste ?
:D
erf, je te remercie pour ton code, mais il ne fonctionne malheureusement pas plus que le mien. Enfin, si je met le nom de mon imprimante, ça marche, mais si je met NULL, j'ai cette satanée erreur sur GetPrinter: "error6: invalid handle".
Je suis sur win2000 (noyau NT), et j'ai l'impression que toutes ces fonctions (CreateFile, SetCommTimeouts, GetPrinter, EnumPrinters, etc.) ont un fonctionnement particulier sous 2000.
Je viens d'essayer EnumPrinters, mais ça ne marche pas non plus... :cry:
et oui, par connectée, je voulais dire "branchée". En fait, je bosse sur une imprmante qui ne s'installe pas(pas de drivers particuliers). C'est un truc un peu particulier, et je n'ai pas le droit de rentrer dans les détails.Citation:
Envoyé par farscape
Mais mon problème, c'est que je dois implémenter une fonction dans mon programme qui indique à l'utilisateur si UNE imprimante est connectée.
Ca me parait un peu hasardeux non? Le créate file peut échouer pour d'autres raisons (mon appli est multithread et j'obtiens parfois des erreurs d'E/S... mais elle sont gérées :D)Citation:
Envoyé par matazz
J'ai essayé le code suivant (utilisation de EnumPrinters):
Et l'erreur renvoyée est: "error 122: la zone de données passé à un appel système est insuffisante"Code:
1
2
3
4
5 PRINTER_INFO_2* p2 = (PRINTER_INFO_2 *)malloc(1000); if (!EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 2, (LPBYTE)p2, 1000, &dwBytesNeeded, &dwBytesReturned)) { ReportLastError("EnumPrinters"); }
J'ai ensuite essayé la même chose mais avec 10000 (à la place de 1000) pour l'allocation. Et là ça marche 8O ...!! Je me demande quelle est la taille exacte à allouer. Mais franchement, ça marche comme ça, je ne vais pas procéder par dychotomie pour trouver la taille exacte (j'ai essayé avec siezof(PRINTER_INFO_2) et pareil: error 122...)
salut,
ça fonctionne pas comme ça !!!
il faut faire un premiere appel pour savoir la taille a allouer :
extrait Fonction en C (je precise)
:DCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 PRINTER_INFO_5* list; DWORD cnt = 0; DWORD sz = 0; int sl; EnumPrinters( PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &sz, &cnt ); if ( (list = (PRINTER_INFO_5*) malloc( sz )) == 0 ) return 0; if (!EnumPrinters( PRINTER_ENUM_LOCAL, NULL, 5, (LPBYTE)list, sz, &sz, &cnt)) { free( list ); return 0; }
ça marche impec!!!
:merci:
mhh... en fait non, je suis désolé mais je me suis trompé :oops: EnumPrinter me renvoie l'imprimante installée (et en plus, l'imprimante par défaut). Ce que je voudrais, c'est savoir quelle imprimante est connectée :cry:
et bien tu demandes la structure PRINTER_INFO_2
au lieu de PRINTER_INFO_5
et tu regardes la zone status .. voir MSDN
:D