Etikettendrucker kann man als Generic/Text only ansprechen.
Das heißt es wird mit VB.net nicht ein Grafik-Objekt erstellt, sondern man muss die Steuerkodes einzeln zum Drucker schicken.
Ich hatte lange nach einer Lösung gesucht, und bin bisher nur auf die Lösung mit DLLs gestoßen.
Hier mal ein Auszug, wer im Internet sucht, wird bestimmt den ganzen restlichen Code finden:
Mit einer früheren VB.Net Version ging alles glatt. Jetzt bekomme ich mit VS2019
eine Fehlermeldung bzw. Warnung bei dieser Zeile:
Die Fehlermeldung lautet:
Ich dachte erst, es würde am ByRef hPrinter As IntPtr hängen, darum habe ich erst mal versucht jeweils Long zu verwenden.
Das hat leider nichts gebracht. So ganz verstehe ich die Fehlermeldung auch nicht, ob das mit der unerwarteten Bytelänge auf dem Stapel zu tun hat?
Hat jemand eine Idee was ich da machen kann. Wenn ich beim Debuggen den Fehler ignoriere wird trotzdem ein Etikett ausgedruckt.
Irgendwie verstehe ich nicht, warum man heutzutage solche Klimmzüge machen muss, um einen Drucker anzusprechen.
Die andere Möglichkeit nach der ich hier mal frage...
Über die Serielle Schnittstelle kann man ja problemlos einzelne Bytes schicken.
Kann man diese Funktionen nicht auch verwenden, um einen Drucker am USB-Port anzusprechen?
Das wäre für mich die einfachste Möglichkeit.
Das heißt es wird mit VB.net nicht ein Grafik-Objekt erstellt, sondern man muss die Steuerkodes einzeln zum Drucker schicken.
Ich hatte lange nach einer Lösung gesucht, und bin bisher nur auf die Lösung mit DLLs gestoßen.
Hier mal ein Auszug, wer im Internet sucht, wird bestimmt den ganzen restlichen Code finden:
VB.NET-Quellcode
- Public Class Class_Drucker
- ' Structure and API declarions:
- <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
- Structure DOCINFOW
- <MarshalAs(UnmanagedType.LPWStr)> Public pDocName As String
- <MarshalAs(UnmanagedType.LPWStr)> Public pOutputFile As String
- <MarshalAs(UnmanagedType.LPWStr)> Public pDataType As String
- End Structure
- <DllImport("winspool.Drv", EntryPoint:="OpenPrinterW",
- SetLastError:=True, CharSet:=CharSet.Unicode,
- ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
- Public Shared Function OpenPrinter(ByVal src As String, ByRef hPrinter As IntPtr, ByVal pd As Long) As Boolean
- End Function
- Public Shared Function SendBytesToPrinter(ByVal szPrinterName As String, ByVal pBytes As IntPtr, ByVal dwCount As Integer) As Boolean
- 'Public Shared Function SendBytesToPrinter(ByVal szPrinterName As String, ByVal pBytes As IntPtr, ByVal dwCount As Int32) As Boolean
- Dim hPrinter As IntPtr ' The printer handle.
- 'Dim hPrinter As Long ' The printer handle.
- Dim dwError As Int32 ' Last error - in case there was trouble.
- Dim di As DOCINFOW ' Describes your document (name, port, data type).
- Dim dwWritten As Int32 ' The number of bytes written by WritePrinter().
- Dim bSuccess As Boolean ' Your success code.
- ' Set up the DOCINFO structure.
- With di
- .pDocName = "Etikett"
- .pDataType = "RAW"
- .pOutputFile = ""
- End With
- ' Assume failure unless you specifically succeed.
- bSuccess = False
- If OpenPrinter(szPrinterName, hPrinter, 0) Then
- If StartDocPrinter(CType(hPrinter, IntPtr), 1, di) Then
- If StartPagePrinter(CType(hPrinter, IntPtr)) Then
- ' Write your printer-specific bytes to the printer.
- bSuccess = WritePrinter(CType(hPrinter, IntPtr), pBytes, dwCount, dwWritten)
- EndPagePrinter(CType(hPrinter, IntPtr))
- End If
- EndDocPrinter(CType(hPrinter, IntPtr))
- End If
- ClosePrinter(CType(hPrinter, IntPtr))
- End If
Mit einer früheren VB.Net Version ging alles glatt. Jetzt bekomme ich mit VS2019
eine Fehlermeldung bzw. Warnung bei dieser Zeile:
Die Fehlermeldung lautet:
Assistent für verwaltetes Debuggen "PInvokeStackImbalance" : "Ein Aufruf an die PInvoke-Funktion "Salmiak_dotnet!Salmiak_dotnet.Class_Drucker::OpenPrinter" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen."
Ich dachte erst, es würde am ByRef hPrinter As IntPtr hängen, darum habe ich erst mal versucht jeweils Long zu verwenden.
Das hat leider nichts gebracht. So ganz verstehe ich die Fehlermeldung auch nicht, ob das mit der unerwarteten Bytelänge auf dem Stapel zu tun hat?
Hat jemand eine Idee was ich da machen kann. Wenn ich beim Debuggen den Fehler ignoriere wird trotzdem ein Etikett ausgedruckt.
Irgendwie verstehe ich nicht, warum man heutzutage solche Klimmzüge machen muss, um einen Drucker anzusprechen.
Die andere Möglichkeit nach der ich hier mal frage...
Über die Serielle Schnittstelle kann man ja problemlos einzelne Bytes schicken.
Kann man diese Funktionen nicht auch verwenden, um einen Drucker am USB-Port anzusprechen?
Das wäre für mich die einfachste Möglichkeit.