Ce code a été fournit sur le forum pcsoft par
Philippe PASQUALI.
//
************************************
// ON REVIENT AVEC CETTE STRUCTURE
//
************************************
_PRINTER_INFO_2 est une structure
pServerName est un entier
pPrinterName est un entier
pShareName est un entier
pPortName est un entier
pDriverName est un entier
pComment est un entier
pLocation est un entier
pDevMode est un entier
pSepFile est un entier
pPrintProcessor est un entier
pDatatype est un entier
pParameters est un entier
pSecurityDescriptor est un entier
Attributes est un entier
Priority est un entier
DefaultPriority est un entier
StartTime est un entier
UntilTime est un entier
Status est un entier
cJobs est un entier
AveragePPM est un entier
END
//
*****************************************************************
// LA FONCTION TRES DETAILLEE POUR
FACILITER LA COMPREHENSION
//
*****************************************************************
FUNCTION iPrinterGetStatus(pPrinterName=iInfoImprimante())
// Renvoie
les informations sur une imprimante
// voir à la fin les informations
renvoyées
hdPrint, Ret, cbBuf, pcbNeeded sont des entiers
sPrinterName est une chaîne ASCIIZ sur 512 = pPrinterName
basePRINTER est un _PRINTER_INFO_2
tPRINTER est un tableau
dynamique de 1 _PRINTER_INFO_2
PRINTER_INFO_LEVEL est
un entier = 2
// Ouverture
du handle avec l'imprimante
Ret = API( winspool_drv,
"OpenPrinterA" , &sPrinterName, &hdPrint,
Null)
IF Ret = 0 THEN RENVOYER
""
// Execution de la fonction une fois avec 0
pour connaitre le nombre exact
cbBuf = 0
pcbNeeded
= 0
API( winspool_drv,
"GetPrinterA", hdPrint,
PRINTER_INFO_LEVEL, &tPRINTER,
cbBuf, &pcbNeeded)
IF pcbNeeded > 0 THEN
cbBuf = pcbNeeded
//
On redimensionne tPrinter de facon a avoir assez de
place.............
//
C'est un peut confu, mais il semble que GetPrinterA stocke dans le
premier tPRINTER[1] les adresses des chaînes
qui sont stockées
aprés mais
DANS la même zone mémoire
//
pcbNeeded : Nombre d'octet pour la structure et les
data
// dimension(basePRINTER)
: Nombre d'octet pour 1 structure
// donc pour etre sur on
prend
PartieEntière(pcbNeeded/Dimension(basePRINTER))+1
Dimension(tPRINTER, PartieEntière(pcbNeeded/Dimension(basePRINTER))+1)
// et on
relance
Ret = API(
winspool_drv, "GetPrinterA", hdPrint, PRINTER_INFO_LEVEL,
&tPRINTER, cbBuf,
&pcbNeeded)
IF
Ret = 0
THEN
API(winspool_drv,"ClosePrinter",
hdPrint)
RENVOYER
""
END
END
API(winspool_drv,"ClosePrinter",
hdPrint)
// Ici on peut exploiter
ServeurName est une chaîne = ChaîneRécupère(
tPRINTER[1]:pServerName,
crAdresseASCIIZ)
PrinterName est une
chaîne = ChaîneRécupère(
tPRINTER[1]:pPrinterName,
crAdresseASCIIZ)
ShareName est une
chaîne = ChaîneRécupère(
tPRINTER[1]:pShareName,
crAdresseASCIIZ)
PortName est une chaîne
= ChaîneRécupère( tPRINTER[1]:pPortName,
crAdresseASCIIZ)
DriverName est une
chaîne = ChaîneRécupère(
tPRINTER[1]:pDriverName,
crAdresseASCIIZ)
Comment est une chaîne
= ChaîneRécupère( tPRINTER[1]:pComment,
crAdresseASCIIZ)
Location est une chaîne
= ChaîneRécupère( tPRINTER[1]:pLocation,
crAdresseASCIIZ)
DevMode est une chaîne
= ChaîneRécupère( tPRINTER[1]:pDevMode,
crAdresseASCIIZ)
SepFile est une chaîne
= ChaîneRécupère( tPRINTER[1]:pSepFile,
crAdresseASCIIZ)
PrintProcessor est une
chaîne = ChaîneRécupère(
tPRINTER[1]:pPrintProcessor,
crAdresseASCIIZ)
sDatatype est une
chaîne = ChaîneRécupère(
tPRINTER[1]:pDatatype,
crAdresseASCIIZ)
Parametres est une
chaîne
Attribut est un entier = tPRINTER[1]:Attributes
Priority
est un entier = tPRINTER[1]:Priority
DefaultPriority est un
entier = tPRINTER[1]:DefaultPriority
StartTime est un entier = tPRINTER[1]:StartTime
UntilTime est un entier
= tPRINTER[1]:UntilTime
Status
est un entier= tPRINTER[1]:Status
cJobs est un entier =
tPRINTER[1]:cJobs
AveragePPM est un entier = tPRINTER[1]:AveragePPM
//*
Concatenation des informations
Resultat est une chaîne
= ""
Resultat += ServeurName +
TAB
// 01
Resultat += PrinterName +
TAB
// 02
Resultat += ShareName +
TAB
// 03
Resultat += PortName + TAB // 04
Resultat
+= DriverName + TAB // 05
Resultat +=
Comment + TAB // 06
Resultat +=
Location + TAB // 07
Resultat +=
DevMode + TAB // 08
Resultat +=
SepFile + TAB // 09
Resultat +=
PrintProcessor + TAB // 10
Resultat +=
sDatatype + TAB // 11
Resultat +=
Parametres + TAB // 12
Resultat +=
NumériqueVersChaîne(Attribut) + TAB //
13
Resultat += NumériqueVersChaîne(Priority) +
TAB // 14
Resultat +=
NumériqueVersChaîne(DefaultPriority) +
TAB // 15
Resultat +=
NumériqueVersChaîne(StartTime) + TAB //
16
Resultat += NumériqueVersChaîne(UntilTime) +
TAB // 17
Resultat +=
NumériqueVersChaîne(Status) + TAB //
18
Resultat += NumériqueVersChaîne(cJobs) + TAB // 19
Resultat +=
NumériqueVersChaîne(AveragePPM) + TAB //
20
// Pour avoir le
status faire Val(ExtraitChaine(....,18))
RENVOYER Resultat
//
*****************************************************************
// DANS LE CODE D'UN BOUTON
//
*****************************************************************
InfoPrinter est une chaîne = iPrinterGetStatus()
IF InfoPrinter <> "" THEN
Status est un entier = Val(ExtraitChaîne(InfoPrinter,18))
END
//
*****************************************************************
// RESULTAT DES TEST
//
*****************************************************************
- Imprimante réseaux prête mais dont le toner est bas 0x20000
(PRINTER_STATUS_TONER_LOW) --> OK
- Imprimante LOCALE absente mais dont le spool est en pause
0x1
(PRINTER_STATUS_PAUSED)
--> OK
-
Imprimante réseaux en bourage papier
0x8
(PRINTER_STATUS_PAPER_JAM) --> OK