Vb.net 通过usb将原始文本发送到打印机
我正在尝试向Zebra ZT230打印机发送ZPL命令。已安装打印机和驱动程序,打印机端口为“USB003”。电脑通过Zebra打印机设置实用程序或ZebraDesign与打印机完美通信。我尝试了以下代码:Vb.net 通过usb将原始文本发送到打印机,vb.net,usb,zebra-printers,zpl,safehandle,Vb.net,Usb,Zebra Printers,Zpl,Safehandle,我正在尝试向Zebra ZT230打印机发送ZPL命令。已安装打印机和驱动程序,打印机端口为“USB003”。电脑通过Zebra打印机设置实用程序或ZebraDesign与打印机完美通信。我尝试了以下代码: Private Declare Function CreateFile Lib "kernel32.dll" (ByVal lpFileName As String, ByVal dwDesiredAccess As FileAccess, _ ByVal dwShareMode As UI
Private Declare Function CreateFile Lib "kernel32.dll" (ByVal lpFileName As String, ByVal dwDesiredAccess As FileAccess, _
ByVal dwShareMode As UInteger, ByVal lpSecurityAttributes As IntPtr, ByVal dwCreationDisposition As FileMode, _
ByVal dwFlagsAndAttributes As UInteger, ByVal hTemplateFile As IntPtr) As System.Runtime.InteropServices.SafeHandle
' Command to be sent to the printer
Dim command As String = "^XA^FO10,10,^AO,30,20^FDFDTesting^FS^FO10,30^BY3^BCN,100,Y,N,N^FDTesting^FS^XZ"
' Create a buffer with the command
Dim buffer() As Byte = New Byte((command.Length) - 1) {}
buffer = System.Text.Encoding.ASCII.GetBytes(command)
' Use the CreateFile external func to connect to the LPT1 port
Dim printer As System.Runtime.InteropServices.SafeHandle = CreateFile("USB003:", FileAccess.ReadWrite, 0, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero)
' Aqui verifico se a impressora � v�lida
If (printer.IsInvalid = true) Then
Return
End If
' Open the filestream to the lpt1 port and send the command
Dim lpt1 As FileStream = New FileStream(printer, FileAccess.ReadWrite)
lpt1.Write(buffer, 0, buffer.Length)
' Close the FileStream connection
lpt1.Close
我在这一行上得到一个错误:
将打印机设置为System.Runtime.InteropServices.SafeHandle=CreateFile(“USB003:”,FileAccess.ReadWrite,0,IntPtr.Zero,FileMode.Open,0,IntPtr.Zero)
错误消息和堆栈跟踪为:
无法封送“返回值”:返回的安全句柄不能是抽象的
在PerfectPotatoInventory.vb.PotatoGlobals.CreateFile(字符串和lpFileName、文件访问dwDesiredAccess、UInt32 dwShareMode、IntPtr lpSecurityAttributes、文件模式dwCreationDisposition、UInt32 dwFlagsAndAttributes、IntPtr hTemplateFile)
在C:\potatos\PerfectPotatoInventory.vb\PerfectPotatoInventory.vb\PotatoGlobals.vb中的PerfectPotatoInventory.vb.PotatoGlobals.PrintLabelTest()中
我在VB.net中使用VS2008,目标是x86和.NET3.5
请告知我做错了什么。使用Zebra.Net SDK,您可以调用以下函数: PrinterUtil.SendContents方法(字符串,字符串) 其中第一个字符串是要发送的ZPL,第二个字符串是打印机连接字符串。更多详细信息可在此处找到:
将此类添加到项目中
Imports System.IO
Imports System.Drawing.Printing
Imports System.Runtime.InteropServices
Public Class RAWPOSPrinter
' 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
<DllImport("winspool.Drv", EntryPoint:="ClosePrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="StartDocPrinterW", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function StartDocPrinter(ByVal hPrinter As IntPtr, ByVal level As Int32, ByRef pDI As DOCINFOW) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="EndDocPrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function EndDocPrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="StartPagePrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function StartPagePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="EndPagePrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function EndPagePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="WritePrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
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 or False on failure.
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 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.
di = New DOCINFOW
With di
.pDocName = "RAW DOC"
.pDataType = "RAW"
End With
' Assume failure unless you specifically succeed.
bSuccess = False
If OpenPrinter(szPrinterName, hPrinter, 0) Then
If StartDocPrinter(hPrinter, 1, di) Then
If StartPagePrinter(hPrinter) Then
' Write your printer-specific bytes to the printer.
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 ' SendBytesToPrinter()
' SendFileToPrinter()
' When the function is given a file name and a printer name,
' the function reads the contents of the file and sends the
' contents to the printer.
' Presumes that the file contains printer-ready data.
' Shows how to use the SendBytesToPrinter function.
' Returns True on success or False on failure.
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 large enough to hold the file's contents.
Dim bytes(fs.Length) As Byte
Dim bSuccess As Boolean
' Your unmanaged pointer.
Dim pUnmanagedBytes As IntPtr
' Read the contents of the file into the array.
bytes = br.ReadBytes(fs.Length)
' Allocate some unmanaged memory for those bytes.
pUnmanagedBytes = Marshal.AllocCoTaskMem(fs.Length)
' Copy the managed byte array into the unmanaged array.
Marshal.Copy(bytes, 0, pUnmanagedBytes, fs.Length)
' Send the unmanaged bytes to the printer.
bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, fs.Length)
' Free the unmanaged memory that you allocated earlier.
Marshal.FreeCoTaskMem(pUnmanagedBytes)
Return bSuccess
End Function ' SendFileToPrinter()
' When the function is given a string and a printer name,
' the function sends the string to the printer as raw bytes.
Public Shared Sub SendStringToPrinter(ByVal szPrinterName As String, ByVal szString As String)
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)
End Sub
End Class
Imports System.IO
导入系统。绘图。打印
导入System.Runtime.InteropServices
公共类打印机
“结构和API声明:
_
结构文档
作为字符串的公共pDocName
作为字符串的公共pOutputFile
作为字符串的公共pDataType
端部结构
_
公共共享函数OpenPrinter(ByVal src作为字符串,ByRef hPrinter作为IntPtr,ByVal pd作为Long)作为布尔值
端函数
_
公共共享函数ClosePrinter(ByVal hPrinter作为IntPtr)作为布尔值
端函数
_
公共共享函数startDocInter(ByVal hPrinter作为IntPtr,ByVal level作为Int32,ByRef pDI作为DOCINFOW)作为布尔值
端函数
_
作为布尔值的公共共享函数EndDocPrinter(ByVal hPrinter作为IntPtr)
端函数
_
公共共享函数StartPagePrinter(ByVal hPrinter作为IntPtr)作为布尔值
端函数
_
作为布尔值的公共共享函数EndPagePrinter(ByVal hPrinter作为IntPtr)
端函数
_
作为布尔值的公共共享函数WritePrinter(ByVal hPrinter作为IntPtr,ByVal pBytes作为IntPtr,ByVal dwCount作为Int32,ByRef dwwrited作为Int32)
端函数
'SendBytesToPrinter()
'当为函数指定打印机名称和非托管的
'字节,函数将这些字节发送到打印队列。
'成功时返回True,失败时返回False。
作为布尔值的公共共享函数sendbytestopinter(ByVal szPrinterName作为字符串,ByVal pBytes作为IntPtr,ByVal dwCount作为Int32)
将HPPrinter调暗为打印机手柄的IntPtr。
将dwError设置为Int32的最后一个错误-以防出现问题。
Dim di As DOCINFOW'描述您的文档(名称、端口、数据类型)。
Dim DWWRITED As Int32'WritePrinter()写入的字节数。
将bSuccess设置为布尔值“您的成功代码”。
'设置DOCINFO结构。
di=新文档w
与di
.pDocName=“原始单据”
.pDataType=“原始”
以
“假设失败,除非你特别成功。
b成功=错误
如果是OpenPrinter(szPrinterName,hpPrinter,0),则
如果启动打印机(hPrinter,1,di),则
如果启动图形打印机(hPrinter),则
'将打印机特定字节写入打印机。
bSuccess=WritePrinter(hPrinter、PB字节、dwCount、DWWrited)
EndPagePrinter(HPPrinter)
如果结束
EndDocPrinter(HPPrinter)
如果结束
闭合打印机(hPrinter)
如果结束
'如果未成功,GetLastError可能会提供更多信息
”“为什么不呢。
如果bsucces=False,则
dwError=Marshal.GetLastWin32Error()
如果结束
返回成功
结束函数'SendBytesToPrinter()
'SendFileToPrinter()
'当为函数指定文件名和打印机名时,
'函数读取文件内容并发送
'将内容添加到打印机。
'假定该文件包含打印机就绪数据。
'显示如何使用SendBytesToPrinter函数。
'成功时返回True,失败时返回False。
作为布尔值的公共共享函数SendFileToPrinter(ByVal szPrinterName作为字符串,ByVal szFileName作为字符串)
'打开文件。
将fs设置为新文件流(szFileName,FileMode.Open)
'在文件上创建二进制读取器。
Dim br作为新的二进制读取器(fs)
'设置足够大的字节数组以容纳文件内容。
Dim字节(fs.Length)作为字节
Dim bsucces作为布尔值
'您的非托管指针。
作为IntPtr的Dim PundManagedBytes
'将文件内容读入数组。
字节=br.ReadBytes(fs.Length)
'为这些字节分配一些非托管内存。
pUnmanagedBytes=Marshal.allocTaskMem(fs.Length)
'将托管字节数组复制到非托管数组中。
Marshal.Copy(字节,0,pUnmanagedBytes,fs.Length)
'将非托管字节发送到打印机。
bSuccess=SendBytesToPrinter(szPrinterName,pUnmanagedBytes,fs.Length)
'释放先前分配的非托管内存。
FreeCoTaskMem元帅(pUnmanagedBytes)
返回成功
结束函数“SendFileToPrinter()
'当为函数指定字符串和打印机名称时,
'函数将字符串作为原始字节发送到打印机。
公共共享子SendStringToPrinter(ByVal szPrinterName作为字符串,ByVal szString作为字符串)
将pBytes变暗为IntPtr
Dim dwCount为Int32
'字符串中有多少个字符?
dwCount=szString.Length()
'假定打印机需要ANSI文本,然后转换
'将字符串转换为ANSI文本。
pBytes=Marshal.StringToCoTaskMemAnsi(szString)
'将转换后的ANSI字符串发送到pr
RAWPOSPrinter.SendStringToPrinter("<NAME OF PRINTER AS IT APPEARS IN DEVICES AND PRINTERS>", "<YOUR ZEBRA COMMAND STRING>")