[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 774
  • Last Modified:

Problem with printing on generic printer.

Hello everyone I have problem when I try to print my textboxes on generic printer (STAR Tsp550 II) ( That printer is used in stores or snack bars or restaurants , you get recipe on that kind of printer -it print only text)

So when I print my form on normal printer there is no problem , But when I try tu print it on generic one I get this message:  

 An unhandled exception of type 'System.ComponentModel.Win32Exception' occurred in system.drawing.dll

Additional information: The data area passed to a system call is too small

AND MY CODE : PrintDocument1.Print() ------------- IS GREEN.

I use visual studio.NET 2002.


PLEASE HELP.

P.S.  I can normally print things on that printer from word or excel.
0
newbie22
Asked:
newbie22
1 Solution
 
kidcarsonCommented:
Print raw data to the printer:

Imports System.IO
Imports System.Drawing.Printing
Imports System.Runtime.InteropServices

Public Class Form1
   Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "
#End Region

   ' 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.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.
       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.SendStringToPrinter(pd.PrinterSettings.PrinterName, s)
       End If

       ' a new page
       s = "         second line" & vbCrLf
       RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s)

   End Sub ' Button2_Click()

End Class


Public Class RawPrinterHelper
   ' 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
   <DllImport("kernel32.dll", EntryPoint:="GetLastError", _
      SetLastError:=True, CharSet:=CharSet.Unicode, _
      ExactSpelling:=True, CallingConvention:=CallingConvention.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(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 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.StringToCoTaskMemAnsi(szString)
       ' Send the converted ANSI string to the printer.
       SendBytesToPrinter(szPrinterName, pBytes, dwCount)
       Marshal.FreeCoTaskMem(pBytes)
   End Function
End Class
0

Featured Post

Prep for the ITIL® Foundation Certification Exam

December’s Course of the Month is now available! Enroll to learn ITIL® Foundation best practices for delivering IT services effectively and efficiently.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now