كيفية إرسال البيانات الأولية إلى طابعة باستخدام Visual Basic.NET

للحصول على إصدار Microsoft Visual C#.NET من هذه المقالة، راجع 322091 .

للحصول على إصدار Microsoft Visual Basic 6.0 من هذه المقالة، راجع 154078 .

للحصول على إصدار + + C غير مدارة من هذه المقالة، راجع 138594 .

تشير هذه المقالة إلى مكتبة فئات Microsoft.NET Framework مساحات الأسماء التالية:
  • System.IO
  • System.Drawing.Printing
  • System.Runtime.InteropService

في هذه المهمة

ملخص

يوضح هذا المقال خطوة بخطوة كيفية استخدام وظائف التخزين المؤقت Win32 من أحد برامج التي تم إنشاؤها باستخدام Visual Basic.NET.


العودة إلى أعلى

مزيد من المعلومات

لإرسال البيانات الأولية إلى طابعة من Microsoft.NET Framework، أن يعمل البرنامج مع وظائف Win32 التخزين المؤقت. من خلال.NET Framework، يمكنك طباعة باستخدام برينتدوكومينتو برينتكونتروليروالفئات المرتبطة بها. ومع ذلك، مع.NET Framework، لا يمكن إرسال بيانات الطابعة جاهزة المنسقة إلى طابعة.

قد تضطر لإرسال البيانات الخام إلى طابعة للقيام بما يلي:
  • إرسال تسلسل الهروب.
  • تحميل، واستخدام خطوط النظام.
  • ملفات التخزين المؤقت قبل الطباعة.
لإرسال هذه الأنواع والأنواع الأخرى من البيانات الخام إلى طابعة، أن تعمل التعليمات البرمجية الخاصة بك مع "واجهات مبرمج التطبيق Win32 التخزين المؤقت" (APIs). التعليمة البرمجية التالية يوضح كيفية قراءة محتويات ملف المنسقة مسبقاً في الذاكرة، وقم بإرسال وحدات البايت تلك إلى الطابعة باستخدام ريتيبرينتير.

ملاحظة: لا يمكنك استخدام هذا الأسلوب في مهمة الطباعة نفس كمهمة طباعة PrintDocument أصلية. يجب أما استخدام.NET Framework للطباعة أو إرسال بايت مهمة الطباعة الخاصة بك.

العودة إلى أعلى

إنشاء مشروع طباعة البيانات المنسقة مسبقاً

لإنشاء المشروع، اتبع الخطوات التالية:
  1. بتشغيل Visual Studio.NET. من القائمة ملف ، انقر فوق جديد، ومن ثم انقر فوق المشروع. ضمن أنواع المشروع، انقر فوق المجلد مشاريع Visual Basic . على قائمة قوالب , انقر فوق تطبيق Windowsومن ثم انقر فوق موافق. بشكل افتراضي، يتم إنشاء Form1.
  2. من القائمة عرض ، انقر فوق مربع الأدوات لعرض مربع الأدوات ثم قم بإضافة زر إلى Form1. يسمى هذا الزر Button1.
  3. إضافة زر آخر إلى Form1. يسمى هذا الزر 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.Printing
    Imports 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 Function
    End Class

  9. اضغط F5 لإنشاء ثم قم بتشغيل البرنامج.
  10. انقر فوق Button1 لتحميل وطباعة محتويات الملف.
  11. انقر فوق Button2 لطباعة سلسلة. (قد تضطر لإخراج الصفحة يدوياً لأن السلسلة التي يتم إرسالها دون أمر formfeed ).
العودة إلى أعلى

المراجع

لمزيد من المعلومات، انقر فوق رقم المقالة التالية لعرضها في "قاعدة معارف Microsoft":

كيفية إرسال البيانات الأولية إلى طابعة باستخدام واجهة برمجة تطبيقات Win32 138594

العودة إلى أعلى
خصائص

رقم الموضوع: 322090 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات