kpaubel
asked on
Sending Data to LPT1
I am trying to send data to the LPT port for a label printer.
I am using VB.NET-VS2005
I have tried several things and none of them are working, and am running out of forums to ask.
The following is what I have tried:
*********1
FileOpen(1, "LPT1", OpenMode.Output)
PrintLine(1, "data")
FileClose(1)
--Got an error about tape drives and other devices and not to use
\\.\
*********2
FileOpen(1, "C:\TEMP\label.txt", OpenMode.Output)
PrintLine(1, "data")
FileClose(1)
Shell("C:\Windows\System32 \Command.c om Copy C:\TEMP\Label.txt LPT1:")
This created a file, but I need to copy it to the LPT port.
THe copy command works through windows command window,
but fails with the shell command in VB.NET.
I am in need of a solution, I have been searching the internet all day for a solution.
Any help would be greatly appreciated.
I am using VB.NET-VS2005
I have tried several things and none of them are working, and am running out of forums to ask.
The following is what I have tried:
*********1
FileOpen(1, "LPT1", OpenMode.Output)
PrintLine(1, "data")
FileClose(1)
--Got an error about tape drives and other devices and not to use
\\.\
*********2
FileOpen(1, "C:\TEMP\label.txt", OpenMode.Output)
PrintLine(1, "data")
FileClose(1)
Shell("C:\Windows\System32
This created a file, but I need to copy it to the LPT port.
THe copy command works through windows command window,
but fails with the shell command in VB.NET.
I am in need of a solution, I have been searching the internet all day for a solution.
Any help would be greatly appreciated.
ASKER
I am using VB.NET-VS2005, not vb 6. I can get it working by starting up a process
and using notepad to print. I would rather go directly to the LPT port as this is the preferred method. I can see samples on the internet for the COM ports, but when I try to utilize the LPT port it fails.
and using notepad to print. I would rather go directly to the LPT port as this is the preferred method. I can see samples on the internet for the COM ports, but when I try to utilize the LPT port it fails.
try this
Imports System.IO
Imports System.Drawing.Printing
Imports System.Runtime.InteropServ ices
Public Class Form1
Inherits System.Windows.Forms.Form
' 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(Me) Then
' Print the file to the printer.
RawPrinterHelper.SendFileT oPrinter(p d.PrinterS ettings.Pr interName, 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.
s = " Hello, this is a test" & vbCrLf
s &= " Second line"
' Open the printer dialog box, and then allow the user to select a printer.
pd.PrinterSettings = New PrinterSettings()
If pd.ShowDialog(Me) Then
RawPrinterHelper.SendStrin gToPrinter (pd.Printe rSettings. PrinterNam e, s)
End If
' a new page
s = " second line" & vbCrLf
RawPrinterHelper.SendStrin gToPrinter (pd.Printe rSettings. PrinterNam e, s)
End Sub ' Button2_Click()
End Class
Public Class RawPrinterHelper
' Structure and API declarions:
<StructLayout(LayoutKind.S equential, CharSet:=CharSet.Unicode)> _
Structure DOCINFOW
<MarshalAs(UnmanagedType.L PWStr)> Public pDocName As String
<MarshalAs(UnmanagedType.L PWStr)> Public pOutputFile As String
<MarshalAs(UnmanagedType.L PWStr)> Public pDataType As String
End Structure
<DllImport("winspool.Drv", EntryPoint:="OpenPrinterW" , _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling Convention .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:=Calling Convention .StdCall)> _
Public Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="StartDocPrint erW", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling Convention .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:=Calling Convention .StdCall)> _
Public Shared Function EndDocPrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="StartPagePrin ter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling Convention .StdCall)> _
Public Shared Function StartPagePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="EndPagePrinte r", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling Convention .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:=Calling Convention .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
<DllImport("kernel32.dll", EntryPoint:="GetLastError" , _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling Convention .StdCall)> _
Public Shared Function GetLastError() As Int32
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.
With di
.pDocName = "My Visual Basic .NET RAW Document"
.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 = GetLastError()
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(szPrint erName, pUnmanagedBytes, fs.Length)
' Free the unmanaged memory that you allocated earlier.
Marshal.FreeCoTaskMem(pUnm anagedByte s)
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 Function 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.StringToCoTaskMemA nsi(szStri ng)
' Send the converted ANSI string to the printer.
SendBytesToPrinter(szPrint erName, pBytes, dwCount)
Marshal.FreeCoTaskMem(pByt es)
End Function
End Class
Imports System.IO
Imports System.Drawing.Printing
Imports System.Runtime.InteropServ
Public Class Form1
Inherits System.Windows.Forms.Form
' 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(Me) Then
' Print the file to the printer.
RawPrinterHelper.SendFileT
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.
s = " Hello, this is a test" & vbCrLf
s &= " Second line"
' Open the printer dialog box, and then allow the user to select a printer.
pd.PrinterSettings = New PrinterSettings()
If pd.ShowDialog(Me) Then
RawPrinterHelper.SendStrin
End If
' a new page
s = " second line" & vbCrLf
RawPrinterHelper.SendStrin
End Sub ' Button2_Click()
End Class
Public Class RawPrinterHelper
' Structure and API declarions:
<StructLayout(LayoutKind.S
Structure DOCINFOW
<MarshalAs(UnmanagedType.L
<MarshalAs(UnmanagedType.L
<MarshalAs(UnmanagedType.L
End Structure
<DllImport("winspool.Drv",
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling
Public Shared Function OpenPrinter(ByVal src As String, ByRef hPrinter As IntPtr, ByVal pd As Long) As Boolean
End Function
<DllImport("winspool.Drv",
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling
Public Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv",
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling
Public Shared Function StartDocPrinter(ByVal hPrinter As IntPtr, ByVal level As Int32, ByRef pDI As DOCINFOW) As Boolean
End Function
<DllImport("winspool.Drv",
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling
Public Shared Function EndDocPrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv",
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling
Public Shared Function StartPagePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv",
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling
Public Shared Function EndPagePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv",
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling
Public Shared Function WritePrinter(ByVal hPrinter As IntPtr, ByVal pBytes As IntPtr, ByVal dwCount As Int32, ByRef dwWritten As Int32) As Boolean
End Function
<DllImport("kernel32.dll",
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=Calling
Public Shared Function GetLastError() As Int32
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.
With di
.pDocName = "My Visual Basic .NET RAW Document"
.pDataType = "RAW"
End With
' Assume failure unless you specifically succeed.
bSuccess = False
If OpenPrinter(szPrinterName,
If StartDocPrinter(hPrinter, 1, di) Then
If StartPagePrinter(hPrinter)
' 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 = GetLastError()
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.
' 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(szPrint
' Free the unmanaged memory that you allocated earlier.
Marshal.FreeCoTaskMem(pUnm
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 Function 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.StringToCoTaskMemA
' Send the converted ANSI string to the printer.
SendBytesToPrinter(szPrint
Marshal.FreeCoTaskMem(pByt
End Function
End Class
ASKER
In the routine SendBytestoPrinter at the OpenPrinter line I am receiving the follwoing error
A call to PInvoke function 'InventoryManager!Inventor yManager.R awPrinterH elper::Ope nPrinter' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.
A call to PInvoke function 'InventoryManager!Inventor
Shell(String.Format("c:\co
uses XP to print
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=3791&lngWId=10
ASKER
Thanks all for your posts on this. I have found a simpler soloution with much less code. Just in case anyone else is following this and wants to view the solution I found, you can view it at
https://support.zebra.com/cpws/docs/zpl/zpl_elp_vbnet.htm
https://support.zebra.com/cpws/docs/zpl/zpl_elp_vbnet.htm
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Private Sub Command1_Click()
PrintThisFile "C:\welcome.txt"
End Sub
Public Sub PrintThisFile(FileName As String)
On Error Resume Next
Dim X As Long
x= ShellExecute(me.hWnd, "Print", FileName, vbNullString, vbNullString, SW_SHOWMAXIMIZED)
End Sub