Solved

Problem with printing on generic printer.

Posted on 2004-04-21
1
730 Views
Last Modified: 2013-12-20
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
Comment
Question by:newbie22
1 Comment
 

Accepted Solution

by:
kidcarson earned 190 total points
ID: 10894577
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

What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

Join & Write a Comment

Suggested Solutions

Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
Using SQL Scripts we can save all the SQL queries as files that we use very frequently on our database later point of time. This is one of the feature present under SQL Workshop in Oracle Application Express.
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
Any person in technology especially those working for big companies should at least know about the basics of web accessibility. Believe it or not there are even laws in place that require businesses to provide such means for the disabled and aging p…

747 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now