bonjour à tous,
tout est dans le titre
merci
bonjour à tous,
tout est dans le titre
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 .
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
![]()
J'y suis presque:![]()
Le OpenPrinter fonctionne, le handle semble correc, mais GetPrinter me renvoie: "erreur 6: descripteur non valide".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
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
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
un detail connectée (ça veut dire installée) ou qu'il y a une imprimante sur le poste ?
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
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...![]()
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.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éesEnvoyé 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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...!! 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)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
ça marche impec!!!
![]()
mhh... en fait non, je suis désolé mais je me suis trompé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
![]()
et bien tu demandes la structure PRINTER_INFO_2
au lieu de PRINTER_INFO_5
et tu regardes la zone status .. voir MSDN
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
Partager