Visual Basic .NET kullanarak yazıcıya ham veri gönderme

Makale çevirileri Makale çevirileri
Makale numarası: 322090 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

™zet

Bu adım adım makalede, Visual Basic .NET kullanarak oluşturduğunuz bir programdan Win32 biriktirici işlevlerinin nasıl kullanılacağı gösterilmektedir.

Ek bilgi

Microsoft .NET Framework'ten bir ham veri yazıcıya göndermek için, programınız Win32 biriktirici işlevleriyle çalışmalıdır. .NET Framework içinden, PrintDocument, PrintController ve ilgili sınıfları kullanarak yazdırabilirsiniz. Ancak, .NET Framework ile, önceden biçimlendirilmiş ve yazdırılmaya hazır verileri yazıcıya gönderemezsiniz.

Yazıcıya şu amaçlarla ham veri göndermeniz gerekebilir:
  • Kaçış sıraları gönderme.
  • Yazılım yazı tiplerini karşıdan yükleyip kullanma.
  • Önceden yazdırılmış dosyaları biriktirme.
Bu ve diğer ham veri türlerini yazıcıya göndermek için, kodunuz Win32 Biriktirici Uygulama Program Arabirimleri (API) ile çalışmalıdır. Aşağıdaki kod, önceden biçimlendirilmiş bir dosyanın içeriğinin belleğe nasıl okunacağını ve sonra da bu baytların WritePrinter kullanılarak yazıcıya nasıl gönderileceğini göstermektedir.

NOT: Bu yaklaşımı, aynı yazdırma işleminde bir yerel PrintDocument yazdırma işlemi olarak kullanamazsınız. Yazdırmak için .NET Framework'ü kullanmanız ya da kendi yazdırma işi baytlarınızı göndermeniz gerekir.


Önceden biçimlendirilmiş verileri yazdıran bir proje oluşturma

Projeyi oluşturmak için şu adımları izleyin:
  1. Visual Studio .NET'i başlatın. File (Dosya) menüsünde, New'i (Yeni) ve sonra da Project'i (Proje) tıklatın. Project Types (Proje Türleri) altında, Visual Basic Projects (Visual Basic Projeleri) klasörünü tıklatın. Templates (Şablonlar) listesinde, Windows Application'ı (Windows Uygulaması) ve sonra da OK'i tıklatın. Varsayılan olarak, Form1 oluşturulur.
  2. View (Görünüm) menüsünde, Toolbox'ı (Araç Kutusu) tıklatıp Toolbox'ı görüntüleyin ve Form1'e bir button (düğme) ekleyin. Bu düğme Button1 olarak adlandırılır.
  3. Form1 başka bir button öğesi ekleyin. Bu düğme Button2 olarak adlandırılır.
  4. Button1'i çift tıklatın. Formun kod penceresi görüntülenir.
  5. Button1_Click alt yordamını aşağıdaki kodla değiştirin:
        ' Düğme için tıklama olay işleyicisi - 
        ' SendFileToPrinter ve SendBytesToPrinter işlevlerinin nasıl kullanıldığını göstermek için tasarlanmıştır.
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ' Kullanıcının bir dosya seçmesine izin ver.
            Dim ofd As New OpenFileDialog()
            If ofd.ShowDialog(Me) Then
                ' Kullanıcının bir yazıcı seçmesine izin ver.
                Dim pd As New PrintDialog()
                pd.PrinterSettings = New PrinterSettings()
                If (pd.ShowDialog() = DialogResult.OK) Then
                    ' Dosyayı yazıcıya yazdır.
                    RawPrinterHelper.SendFileToPrinter(pd.PrinterSettings.PrinterName, ofd.FileName)
                End If
            End If
        End Sub ' Button1_Click()
    					
  6. Button2_Click alt yordamını aşağıdaki kodla değiştirin:
        ' Düğme için tıklama olay işleyicisi - 
        ' SendBytesToPrinter işlevinin yazıcıya dize göndermede nasıl kullanıldığını göstermek için tasarlanmıştır.
        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()
    
            ' Gönderilecek bir dize gerekli.
            s = "Merhaba, bu bir sınama"
            ' Yazıcı iletişim kutusunu aç ve kullanıcının yazıcı seçmesini sağla.
            pd.PrinterSettings = New PrinterSettings()
            If (pd.ShowDialog() = DialogResult.OK) Then
                RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s)
            End If
        End Sub ' Button2_Click()
    					
  7. Aşağıdaki kodu dosyanın en üstüne ekleyin:
    Imports System.IO
    Imports System.Drawing.Printing
    Imports System.Runtime.InteropServices
    					
  8. Aşağıdaki kodu, ana uygulama ad alanının içine, ama tüm sınıf tanımlarının dışına ekleyin:
    Public Class RawPrinterHelper
        ' Yapı ve API bildirimleri:
        <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()
        ' İşleve bir yazıcı adı ve yönetilmeyen bir bayt dizisi verildiğinde,
        ' işlev bu baytları yazdırma sırasına gönderir.
        ' Başarılı olduğunda True, hata durumunda False döndürür.
        Public Shared Function SendBytesToPrinter(ByVal szPrinterName As String, ByVal pBytes As IntPtr, ByVal dwCount As Int32) As Boolean
            Dim hPrinter As IntPtr      ' Yazıcı tanıtıcı.
            Dim dwError As Int32        ' Son hata - bir sorun ortaya çıkarsa.
            Dim di As DOCINFOW          ' Belgenizi tanımlar (ad, bağlantı noktası, veri türü).
            Dim dwWritten As Int32      ' WritePrinter() tarafından yazılan bayt sayısı.
            Dim bSuccess As Boolean     ' Başarı kodunuz.
    
            ' DOCINFO yapısını hazırla.
            With di
                .pDocName = "Visual Basic .NET RAW Belgem"
                .pDataType = "RAW"
            End With
            ' Başarılı olduğu belirlenmedikçe başarısız olduğunu varsay.
            bSuccess = False
            If OpenPrinter(szPrinterName, hPrinter, 0) Then
                If StartDocPrinter(hPrinter, 1, di) Then
                    If StartPagePrinter(hPrinter) Then
                        ' Yazıcıya özel baytları yazıcıya yaz.
                        bSuccess = WritePrinter(hPrinter, pBytes, dwCount, dwWritten)
                        EndPagePrinter(hPrinter)
                    End If
                    EndDocPrinter(hPrinter)
                End If
                ClosePrinter(hPrinter)
            End If
            ' Başarılı olmadıysa, GetLastError neden başarısız olunduğu
            ' hakkında daha fazla bilgi verebilir.
            If bSuccess = False Then
                dwError = Marshal.GetLastWin32Error()
            End If
            Return bSuccess
        End Function ' SendBytesToPrinter()
    
        ' SendFileToPrinter()
        ' İşleve bir dosya adı ve bir yazıcı adı verildiğinde,
        ' işlev dosyanın içeriğini okur ve
        ' içeriği yazıcıya gönderir.
        ' Dosyanın yazdırılmaya hazır veri içerdiğini kabul eder.
        ' SendBytesToPrinter işlevinin nasıl kullanılacağını gösterir.
        ' Başarılı olduğunda True, hata durumunda False döndürür.
        Public Shared Function SendFileToPrinter(ByVal szPrinterName As String, ByVal szFileName As String) As Boolean
            ' Dosyayı aç.
            Dim fs As New FileStream(szFileName, FileMode.Open)
            ' Dosya için bir BinaryReader oluştur.
            Dim br As New BinaryReader(fs)
            ' Dosya içeriğini alacak kadar büyük bir bayt dizisi oluştur.
            Dim bytes(fs.Length) As Byte
            Dim bSuccess As Boolean
            ' Yönetilmeyen işaretçiniz.
            Dim pUnmanagedBytes As IntPtr
    
            ' Dosya içeriğini dizi içine oku.
            bytes = br.ReadBytes(fs.Length)
            ' Bu baytlar için bir miktar yönetilmeyen bellek ayır.
            pUnmanagedBytes = Marshal.AllocCoTaskMem(fs.Length)
            ' Yönetilen bayt dizini yönetilmeyen diziye kopyala.
            Marshal.Copy(bytes, 0, pUnmanagedBytes, fs.Length)
            ' Yönetilmeyen baytları yazıcıya gönder.
            bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, fs.Length)
            ' Daha önce ayrılan yönetilmeyen belleği serbest bırak.
            Marshal.FreeCoTaskMem(pUnmanagedBytes)
            Return bSuccess
        End Function ' SendFileToPrinter()
    
        ' İşleve bir dize ve bir yazıcı adı verildiğinde,
        ' işlev dizeyi ham bayt olarak yazıcıya gönderir.
        Public Shared Function SendStringToPrinter(ByVal szPrinterName As String, ByVal szString As String)
            Dim pBytes As IntPtr
            Dim dwCount As Int32
            ' Dizede kaç karakter var?
            dwCount = szString.Length()
            ' Yazıcının ANSI metin beklediğini kabul et ve
            ' dizeyi ANSI metne dönüştür.
            pBytes = Marshal.StringToCoTaskMemAnsi(szString)
            ' Dönüştürülmüş ANSI dizeyi yazıcıya gönder.
            SendBytesToPrinter(szPrinterName, pBytes, dwCount)
            Marshal.FreeCoTaskMem(pBytes)
        End Function
    End Class
    					
  9. Programı derlemek ve çalıştırmak için F5 tuşuna basın.
  10. Bir dosyanın içeriğini yüklemek ve yazdırmak için Button1 düğmesini tıklatın.
  11. Bir dize yazdırmak için Button2 düğmesini tıklatın. (Dize formfeed (sayfa sür) komutu olmadan gönderildiği için, sayfayı el ile çıkarmanız gerekebilir.)

Referanslar

Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
138594 Win32 API kullanarak yazıcıya ham veri gönderme (Bu bağlantı, bir kısmı veya tamamı İngilizce olan içeriğe işaret edebilir.)

Özellikler

Makale numarası: 322090 - Last Review: 30 Ocak 2006 Pazartesi - Gözden geçirme: 7.0
Bu makaledeki bilginin uygulandigi durum:
  • Microsoft .NET Framework Software Development Kit 1.0 Service Pack 2
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Anahtar Kelimeler: 
kbdswgdi2003swept kbhowtomaster KB322090

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com