Wij hebben etikettenprinters bij de lopende banden die etiketten op de producten printen met Zebra printers. Nu willen wij dat het niet mogelijk is een nieuwe printopdracht te geven, als de printerbuffer nog niet leeg is. Dit om te voorkomen dat er etiketten van de verkeerde productieorder op een productieorder komen.
Als er op Printen geklikt wordt, en de printbuffer nog niet leeg is, dan komt er een waarschuwing dat de printbuffer eerst leeggemaakt moet worden. Dit kan dan door op een knop "Printbuffer leegmaken" te drukken. Deze knop stuurt de ZPL-code "~JA" naar de printer waardoor de printbuffer leeggemaakt wordt, en de printer stopt met printen. Het leegmaken van de buffer heb ik succesvol getest.
Dit heb ik mogelijk gemaakt door het aanspreken van winspool.drv unmanaged code.
Dit is niet alle code, ook OpenPrinterA, ClosePrinter, StartDocPrinterA, EndDocPrinter, StartPagePrinter, en EndPagePrinter gebruik ik. Deze code wordt door enkele methods aangeroepen die de unmanaged code bruikbaar maken voor managed code.
Nu moet het gedeelte nog komen dat de receivebuffer uitgelezen kan worden, om te kijken of deze leeg is, of er nog nummers in staan. Dit kan met het ZPL-commando "~HS" en dan de number of formats in de receive buffer uitlezen.
Dus lijkt het mij dat je ook "ReadPrinter" kan doen, dus zoiets als:
Ik kan echter nergens documentatie over "ReadPrinter" vinden (de parameters in bovenstaand voorbeeld heb ik gegokt). Het gaat om een netwerkprinter. Is het uberhaupt wel mogelijk de receive buffer in de printer uit te lezen? Weet iemand hoe ik dit kan doen, of wat de parameters zijn die ReadPrinter in winspool.drv verwacht zijn?
Als er op Printen geklikt wordt, en de printbuffer nog niet leeg is, dan komt er een waarschuwing dat de printbuffer eerst leeggemaakt moet worden. Dit kan dan door op een knop "Printbuffer leegmaken" te drukken. Deze knop stuurt de ZPL-code "~JA" naar de printer waardoor de printbuffer leeggemaakt wordt, en de printer stopt met printen. Het leegmaken van de buffer heb ik succesvol getest.
Dit heb ik mogelijk gemaakt door het aanspreken van winspool.drv unmanaged code.
C#:
1
2
| [DllImport("winspool.drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] private static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten); |
Dit is niet alle code, ook OpenPrinterA, ClosePrinter, StartDocPrinterA, EndDocPrinter, StartPagePrinter, en EndPagePrinter gebruik ik. Deze code wordt door enkele methods aangeroepen die de unmanaged code bruikbaar maken voor managed code.
Nu moet het gedeelte nog komen dat de receivebuffer uitgelezen kan worden, om te kijken of deze leeg is, of er nog nummers in staan. Dit kan met het ZPL-commando "~HS" en dan de number of formats in de receive buffer uitlezen.
Dus lijkt het mij dat je ook "ReadPrinter" kan doen, dus zoiets als:
C#:
1
2
3
| [DllImport("winspool.drv", EntryPoint = "ReadPrinter", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] private static extern bool ReadPrinter(IntPtr hPrinter, ref IntPtr pBytes, Int32 dwCount, ref Int32 dwNReadBytes); |
Ik kan echter nergens documentatie over "ReadPrinter" vinden (de parameters in bovenstaand voorbeeld heb ik gegokt). Het gaat om een netwerkprinter. Is het uberhaupt wel mogelijk de receive buffer in de printer uit te lezen? Weet iemand hoe ik dit kan doen, of wat de parameters zijn die ReadPrinter in winspool.drv verwacht zijn?