程序代码:
'Form1 代码 Imports System.Drawing.Printing Public Class Form1 ' Click event handler for a button - designed to show how to use the ' SendFileToPrinter and SendBytesToPrinter functions. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Allow the user to select a file. Dim ofd As New OpenFileDialog() If ofd.ShowDialog(Me) Then ' Allow the user to select a printer. Dim pd As New PrintDialog() pd.PrinterSettings = New PrinterSettings() If (pd.ShowDialog() = DialogResult.OK) Then ' Print the file to the printer. RawPrinterHelper.SendFileToPrinter(pd.PrinterSettings.PrinterName, ofd.FileName) End If End If End Sub ' Button1_Click() ' Click event handler for a button - designed to show how to use the ' SendBytesToPrinter function to send a string to the printer. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim s As String Dim pd As New PrintDialog() ' You need a string to send. Dim ZPLString As String = _ "^XA" & _ "^PRB" & _ "^MD10" & _ "^MNY" & _ "^LH0,0^FS" & _ "^FO630,01^AIR,33,0^CI0^FR^FD@2^FS" & _ "^FO670,01^AIR,33,0^CI0^FR^FD@1^FS" & _ "^PQ1,0,0,N" & _ "^XZ" ' Open the printer dialog box, and then allow the user to select a printer. pd.PrinterSettings = New PrinterSettings() If (pd.ShowDialog() = DialogResult.OK) Then RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, ZPLString) End If End Sub End Class
程序代码:
'RawPrinterHelper类 Imports Imports System.Drawing.Printing Imports System.Runtime.InteropServices Public Class RawPrinterHelper ' Structure and API declarions: <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _ Public Class DOCINFOA <MarshalAs(UnmanagedType.LPStr)> _ Public pDocName As String <MarshalAs(UnmanagedType.LPStr)> _ Public pOutputFile As String <MarshalAs(UnmanagedType.LPStr)> _ Public pDataType As String End Class <DllImport("winspool.Drv", EntryPoint:="OpenPrinterA", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ Public Shared Function OpenPrinter(<MarshalAs(UnmanagedType.LPStr)> ByVal szPrinter As String, ByRef hPrinter As IntPtr, ByVal pd As IntPtr) As Boolean End Function <DllImport("winspool.Drv", EntryPoint:="ClosePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ Public Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean End Function <DllImport("winspool.Drv", EntryPoint:="StartDocPrinterA", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ Public Shared Function StartDocPrinter(ByVal hPrinter As IntPtr, ByVal level As Int32, <[In](), MarshalAs(UnmanagedType.LPStruct)> ByVal di As DOCINFOA) As Boolean End Function <DllImport("winspool.Drv", EntryPoint:="EndDocPrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ Public Shared Function EndDocPrinter(ByVal hPrinter As IntPtr) As Boolean End Function <DllImport("winspool.Drv", EntryPoint:="StartPagePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ Public Shared Function StartPagePrinter(ByVal hPrinter As IntPtr) As Boolean End Function <DllImport("winspool.Drv", EntryPoint:="EndPagePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ Public Shared Function EndPagePrinter(ByVal hPrinter As IntPtr) As Boolean End Function <DllImport("winspool.Drv", EntryPoint:="WritePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ Public Shared Function WritePrinter(ByVal hPrinter As IntPtr, ByVal pBytes As IntPtr, ByVal dwCount As Int32, ByRef dwWritten As Int32) As Boolean End Function ' SendBytesToPrinter() ' When the function is given a printer name and an unmanaged array ' of bytes, the function sends those bytes to the print queue. ' Returns true on success, false on failure. Public Shared Function SendBytesToPrinter(ByVal szPrinterName As String, ByVal pBytes As IntPtr, ByVal dwCount As Int32) As Boolean Dim dwError As Int32 = 0, dwWritten As Int32 = 0 Dim hPrinter As New IntPtr(0) Dim di As New DOCINFOA() Dim bSuccess As Boolean = False ' Assume failure unless you specifically succeed. di.pDocName = "My RAW Document" di.pDataType = "RAW" ' Open the printer. If OpenPrinter(szPrinterName.Normalize(), hPrinter, IntPtr.Zero) Then ' Start a document. If StartDocPrinter(hPrinter, 1, di) Then ' Start a page. If StartPagePrinter(hPrinter) Then ' Write your bytes. bSuccess = WritePrinter(hPrinter, pBytes, dwCount, dwWritten) EndPagePrinter(hPrinter) End If EndDocPrinter(hPrinter) End If ClosePrinter(hPrinter) End If ' If you did not succeed, GetLastError may give more information ' about why not. If bSuccess = False Then dwError = Marshal.GetLastWin32Error() End If Return bSuccess End Function Public Shared Function SendFileToPrinter(ByVal szPrinterName As String, ByVal szFileName As String) As Boolean ' Open the file. Dim fs As New FileStream(szFileName, FileMode.Open) ' Create a BinaryReader on the file. Dim br As New BinaryReader(fs) ' Dim an array of bytes big enough to hold the file's contents. Dim bytes As Byte() = New Byte(fs.Length - 1) {} Dim bSuccess As Boolean = False ' Your unmanaged pointer. Dim pUnmanagedBytes As New IntPtr(0) Dim nLength As Integer nLength = Convert.ToInt32(fs.Length) ' Read the contents of the file into the array. bytes = br.ReadBytes(nLength) ' Allocate some unmanaged memory for those bytes. pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength) ' Copy the managed byte array into the unmanaged array. Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength) ' Send the unmanaged bytes to the printer. bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength) ' Free the unmanaged memory that you allocated earlier. Marshal.FreeCoTaskMem(pUnmanagedBytes) Return bSuccess End Function Public Shared Function SendStringToPrinter(ByVal szPrinterName As String, ByVal szString As String) As Boolean Dim pBytes As IntPtr Dim dwCount As Int32 ' How many characters are in the string? dwCount = szString.Length ' Assume that the printer is expecting ANSI text, and then convert ' the string to ANSI text. pBytes = Marshal.StringToCoTaskMemAnsi(szString) ' Send the converted ANSI string to the printer. SendBytesToPrinter(szPrinterName, pBytes, dwCount) Marshal.FreeCoTaskMem(pBytes) Return True End Function End Class
上述代码成功将ZPL指令发送到本地USB端口连接的打印机,并提示“正在打印”。只是本地打印机非zebra的打印机,无法为你测试结果
你将这个类的代码全部替换到你的类代码,测试下。只是你的本地USB端口有zebra的打印机么
===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================