Τρόπος αποστολής μη επεξεργασμένα δεδομένα σε έναν εκτυπωτή με χρήση της Visual Basic .NET

Η υποστήριξη για τα Windows XP έχει διακοπεί

Η Microsoft διέκοψε την υποστήριξη για τα Windows XP στις 8 Απριλίου 2014. Αυτή η αλλαγή επηρέασε τις ενημερώσεις λογισμικού και τις επιλογές ασφαλείας σας. Μάθετε τι σημαίνει αυτό για εσάς και το πώς θα προστατευτείτε.

ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.

Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:322090
Αυτό το αρχείο έχει αρχειοθετηθεί. Προσφέρεται “ως έχει” και δεν θα ενημερώνεται πια.
Για την έκδοση Microsoft Visual C# .NET αυτού του άρθρου, ανατρέξτε στην ενότητα322091.
Για την έκδοση αυτού του άρθρου Microsoft Visual Basic 6.0, ανατρέξτε στην ενότητα154078.
Για μια μη διαχειριζόμενη C++ έκδοση αυτού του άρθρου, ανατρέξτε στην ενότητα138594.

Αυτό το άρθρο αφορά τα παρακάτω πεδία ονομάτων του Microsoft .NET Framework Class Library:
  • System.IO
  • System.Drawing.Printing
  • System.Runtime.InteropService

Σε αυτήν την εργασία

Περίληψη
Αυτό το άρθρο βήμα προς βήμα σας δείχνει τον τρόπο χρήσης του Win32 λειτουργίες ουράς από ένα πρόγραμμα που έχετε δημιουργήσει με χρήση της Visual Basic .NET.

Περισσότερες πληροφορίες

Αποστολή ακατέργαστων δεδομένων σε έναν εκτυπωτή από το Microsoft .NET Framework, το πρόγραμμα πρέπει να εργαστείτε με τις λειτουργίες ουράς εκτύπωσης Win32. Μέσω του .NET Framework, μπορείτε να εκτυπώσετε χρησιμοποιώνταςPrintDocument,PrintController, και τις σχετιζόμενες κλάσεις. Ωστόσο, με το .NET Framework, δεν μπορείτε να στείλετε προ-μορφοποιημένων δεδομένων έτοιμο εκτυπωτή σε εκτυπωτή.

Ίσως χρειαστεί να στείλει μη επεξεργασμένα δεδομένα σε έναν εκτυπωτή για να κάνετε τα εξής:
  • Στείλτε τις ακολουθίες χαρακτήρων escape.
  • Κάντε λήψη και στη συνέχεια χρησιμοποιήστε γραμματοσειρές που φορτώνονται.
  • Τα αρχεία εκτύπωσης σε ουρά προεκτυπωμένες.
Για την αποστολή αυτών των τύπων και άλλους τύπους μη επεξεργασμένα δεδομένα σε έναν εκτυπωτή, ο κώδικάς σας πρέπει να εργαστείτε με διασυνδέσεις προγραμματιστές εφαρμογής ουράς εκτύπωσης Win32 (API). Ο ακόλουθος κώδικας εμφανίζει τον τρόπο ανάγνωσης των περιεχομένων ενός αρχείου προ-στη μνήμη και στη συνέχεια να αποστείλετε αυτά τα byte που τον εκτυπωτή χρησιμοποιώνταςWritePrinter.

ΣΗΜΕΙΩΣΗ: Δεν μπορείτε να χρησιμοποιήσετε αυτήν την προσέγγιση στην ίδια εργασία εκτύπωσης ως ένα εγγενέςPrintDocumentη εργασία εκτύπωσης. Πρέπει είτε να χρησιμοποιήσετε το .NET Framework για εκτύπωση ή αποστολή byte που τη δική σας εργασία εκτύπωσης.


Δημιουργήστε ένα έργο το οποίο εκτυπώνει προ-μορφοποιημένων δεδομένων

Για να δημιουργήσετε το έργο, ακολουθήστε τα εξής βήματα:
  1. Ξεκινήστε το Visual Studio .NET. Στο διακομιστήFILEμενού, κάντε κλικ στο κουμπίΝέα, και στη συνέχεια κάντε κλικ στο κουμπίΤο έργο. underΤύποι έργουΚάντε κλικ στην καρτέλαΈργα της Visual BasicΦάκελος. Στο διακομιστήΠρότυπαλίστα, κάντε κλικ στο κουμπίΕφαρμογή των Windows, και στη συνέχεια κάντε κλικ στο κουμπίOk. Από προεπιλογή, δημιουργείται η φόρμα Form1.
  2. Στο διακομιστήViewμενού, κάντε κλικ στο κουμπίΕργαλειοθήκηΓια να εμφανίσετε την εργαλειοθήκη και στη συνέχεια προσθέστε ένακουμπίΓια να Φόρμα1. Το κουμπί αυτό ονομάζεται Button1.
  3. Προσθήκη άλλουκουμπίΓια να Φόρμα1. Το κουμπί αυτό ονομάζεται Button2.
  4. Διπλό κλικButton1. Εμφανίζεται το παράθυρο κώδικα της φόρμας.
  5. Αντικαταστήστε το αρχείοButton1_Clickυπορουτίνα με τον ακόλουθο κώδικα:
        ' 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()					
  6. Αντικαταστήστε το αρχείοButton2_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"        ' 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, s)        End If    End Sub ' Button2_Click()					
  7. Εισαγάγετε τον ακόλουθο κώδικα στο επάνω μέρος του αρχείου:
    Imports System.IOImports System.Drawing.PrintingImports System.Runtime.InteropServices					
  8. Προσθέστε τον ακόλουθο κώδικα μέσα στο χώρο ονομάτων κύρια εφαρμογή, αλλά έξω από οποιουσδήποτε ορισμούς κλάσης:
    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    ' 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 = 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 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 FunctionEnd Class					
  9. Πατήστε F5 για να δημιουργήσετε και κατόπιν εκτελέστε το πρόγραμμα.
  10. Κάντε κλικButton1Για να φορτώσετε και να εκτυπώσετε τα περιεχόμενα ενός αρχείου.
  11. Κάντε κλικButton2Για να εκτυπώσετε μια συμβολοσειρά. (Ίσως χρειαστεί να αφαιρέσετε με μη αυτόματο τρόπο τη σελίδα επειδή η ακολουθία χαρακτήρων αποστέλλεται χωρίς τηνformfeedεντολή).
Αναφορές
Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
138594Τρόπος αποστολής μη επεξεργασμένα δεδομένα σε έναν εκτυπωτή, χρησιμοποιώντας το API του Win32

Προειδοποίηση: Αυτό το άρθρο έχει μεταφραστεί αυτόματα

Ιδιότητες

Αναγνωριστικό άρθρου: 322090 - Τελευταία αναθεώρηση: 12/07/2015 10:54:05 - Αναθεώρηση: 2.0

Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Windows XP Professional

  • kbnosurvey kbarchive kbdswgdi2003swept kbhowtomaster kbmt KB322090 KbMtel
Σχόλια