Bonjour à tous,

Je suis actuellement en train d'explorer le monde merveilleux des API liées à l'impression (d'étiquettes avec imprimante à ruban Zebra ZM600 200dpi (ZPL)). Je voudrai d'ailleurs pouvoir informer l'imprimante d'un changement de format d'étiquette sans que l'utilisateur n'aie à fouiller dans les options d'impression.
De fil en aiguille j'ai mis la main sur l'API "DocumentPropertiesA" qui permet de récupérer des informations sur le driver d'une imprimante ou de le modifier à loisir.
Mais voilà, je bute sur l'utilisation de la coquine. Voici sans plus attendre le code que j'utilise :

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
39
40
41
42
43
44
45
46
47
 
PROCEDURE PR_TEST_GetDocumentProperties(sUnNomDImprimante est une chaîne)
 
nWindowHandle 		est un entier
nPrinterHandle 		est un entier
sPrinterName 		est une chaîne = sUnNomDImprimante
nDEV_MODE_OUT		est un entier
nTailleBuffer 		est un entier
nRetourFonction		est un entier
DevMode 			est un STDEVMODE
 
// Récupération du handle de l'imprimante
nRetourFonction = API("winspool.drv", "OpenPrinterA",&sPrinterName,&nPrinterHandle,Null)
 
// Premier appel "à vide" pour récupérer la taille du buffer à créer
nTailleBuffer = API("WINSPOOL.DRV", "DocumentPropertiesA", Handle(), nPrinterHandle, &sPrinterName, Null, Null, Null)
 
// Création du buffer
nDEV_MODE_OUT = API("KERNEL32", "GlobalAlloc", 0x0040, nTailleBuffer)
 
// 2° appel pour récupération des informations concernant le driver dans nDEV_MODE_OUT
nRetourFonction = API("WINSPOOL.DRV", "DocumentPropertiesA", Handle(), nPrinterHandle, &sPrinterName, nDEV_MODE_OUT, Null, "DM_OUT_BUFFER")
 
// Transfert des informations dans une structure DEVMODE
API("kernel32","RtlMoveMemory",&DevMode,&nDEV_MODE_OUT,Taille(nDEV_MODE_OUT))
 
// Fermeture de l'imprimante
API("WINSPOOL.DRV","ClosePrinter",nPrinterHandle)
 
ch est une chaîne = "Name : "+DevMode:dmDeviceName
ch+=RC+"Version : "+DevMode:dmSpecVersion
ch+=RC+"Driver version : "+DevMode:dmDriverVersion
ch+=RC+"Size : "+DevMode:dmSize
ch+=RC+"Driver Extra : "+DevMode:dmDriverExtra
ch+=RC+"Fields : "+DevMode:dmFields
ch+=RC+"Orientation : "+DevMode:dmOrientation
ch+=RC+"PaperSize : "+DevMode:dmPaperSize
ch+=RC+"PaperLength : "+DevMode:dmPaperLength
ch+=RC+"Paperwidth : "+DevMode:dmPaperWidth
ch+=RC+"Scale : "+DevMode:dmScale
ch+=RC+"Copies : "+DevMode:dmCopies
ch+=RC+"Qualité : "+DevMode:dmPrintQuality
ch+=RC+"FormName : "+DevMode:dmFormName
Info(ch)
 
nRetourFonction = API("KERNEL32","GetLastError")
ErrorMessage est une chaîne = GetErrorMessage(nRetourFonction)
La fenêtre des options d'impression s'affiche comme convenu, mais ma structure DevMode reste désespérément vide et pour cause : GetLastError me renvoie le code erreur n°13, qui correspond à "The data is invalid". Je n'ai pas réussi à avoir mieux que cela.

Si quelqu'un pouvait m'éclairer sur l'utilisation de cette API j'en serai fort obligé !

Annexe :
Doc MSDN sur l'API : http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
Exemple d'utilisation (pas en W-Langage) : http://www.amyuni.com/downloads/tn02.htm

(Edit) - Oh ! Et j'utilise WD14 et XP SP3, si peut faire avancer l'affaire ...