Pagina 1 di 6 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 60
  1. #1

    [VB.NET] Stampante virtuale

    Salve a tutti,
    è possibile creare in VB.NET o C# una stampante virtuale?
    In poche parole ho bisogno di realizzare un programmino ( o un driver??? ) che mi finisca come se fosse una stampante installata tra le altre stampanti ( un pò come fa il pdf995 ) in modo da poter catturare l input di stampa per fare delle operazioni.
    Si può fare??

  2. #2
    Puoi appoggiarti a RedMon.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Tu l hai già utilizzato?

  4. #4
    No, ma lo conosco perché mi ero informato per fare una cosa analoga.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Ok provo vediamo cosa riesco a fare!

  6. #6
    Sembra funzionare egregiamente!!!!!
    Solo una cosa..... vb net accetta di ricevere dati in standard input? Se si come posso leggerli e memorizzarli?

  7. #7
    Devi creare un'applicazione console e leggere i dati con l'oggetto Console (ad esempio per leggere una riga puoi usare Console.ReadLine()).
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Ho provato ma non legge l input che gli arriva o meglio non da alcun errore ma nella variabile dove provo a memorizzarlo non c'è nulla... forse sbaglio la tipologia di variabile in quanto l'ho impostata di tipo testo ( String ) e forse va impostata come un array di bytes... anche se penso che il Redmon passi una serie di caratteri Postscript... che dici??

  9. #9
    Sei sicuro di aver creato un'applicazione console e di aver impostato correttamente RedMon?
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Si tutto ok sono riuscito ad ottenere tutto quanto passa RedMon allo stdin.
    Il codice passato è una serie di caratteri per me incomprensibili e non sto qui ad incollarlo.

    Adesso dovrei passare questo codice direttamente alla stampante.... cosa che ho provato utilizzando questa classe:

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

    Public Class RawPrinterHelper
    ' Structure and API declarions:
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
    Public Class DOCINFOA
    <MarshalAs(UnmanagedType.LPStr)> _
    Public pDocName As String
    <MarshalAs(UnmanagedType.LPStr)> _
    Public pOutputFile As String
    <MarshalAs(UnmanagedType.LPStr)> _
    Public pDataType As String
    End Class
    <DllImport("winspool.Drv", EntryPoint:="OpenPrinterA", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function OpenPrinter(<MarshalAs(UnmanagedType.LPStr)> ByVal szPrinter As String, ByRef hPrinter As IntPtr, ByVal pd As IntPtr) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="ClosePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="StartDocPrinterA", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function StartDocPrinter(ByVal hPrinter As IntPtr, ByVal level As Int32, <[In](), MarshalAs(UnmanagedType.LPStruct)> ByVal di As DOCINFOA) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="EndDocPrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function EndDocPrinter(ByVal hPrinter As IntPtr) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="StartPagePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function StartPagePrinter(ByVal hPrinter As IntPtr) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="EndPagePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function EndPagePrinter(ByVal hPrinter As IntPtr) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="WritePrinter", SetLastError:=True, 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, false on failure.
    Public Shared Function SendBytesToPrinter(ByVal szPrinterName As String, ByVal pBytes As IntPtr, ByVal dwCount As Int32) As Boolean
    Dim dwError As Int32 = 0, dwWritten As Int32 = 0
    Dim hPrinter As New IntPtr(0)
    Dim di As New DOCINFOA()
    Dim bSuccess As Boolean = False
    ' Assume failure unless you specifically succeed.
    di.pDocName = "My C#.NET RAW Document"
    di.pDataType = "RAW"

    ' Open the printer.
    If OpenPrinter(szPrinterName.Normalize(), hPrinter, IntPtr.Zero) Then
    ' Start a document.
    If StartDocPrinter(hPrinter, 1, di) Then
    ' Start a page.
    If StartPagePrinter(hPrinter) Then
    ' Write your bytes.
    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

    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 big enough to hold the file's contents.
    Dim bytes As Byte() = New Byte(fs.Length - 1) {}
    Dim bSuccess As Boolean = False
    ' Your unmanaged pointer.
    Dim pUnmanagedBytes As New IntPtr(0)
    Dim nLength As Integer

    nLength = Convert.ToInt32(fs.Length)
    ' Read the contents of the file into the array.
    bytes = br.ReadBytes(nLength)
    ' Allocate some unmanaged memory for those bytes.
    pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength)
    ' Copy the managed byte array into the unmanaged array.
    Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength)
    ' Send the unmanaged bytes to the printer.
    bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength)
    ' Free the unmanaged memory that you allocated earlier.
    Marshal.FreeCoTaskMem(pUnmanagedBytes)
    Return bSuccess
    End Function
    Public Shared Function SendStringToPrinter(ByVal szPrinterName As String, ByVal szString As String) As Boolean
    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)
    Return True
    End Function
    End Class

    seguendo una guida microsoft http://support.microsoft.com/kb/322090 .

    Non da errori solo che la stampante prende in carico la stampa, la termina ma materialmente non stampa nulla.

    E' come se ricevesse i bytes di stampa ma poi rimanessero solo memorizzati e non parta il foglio.

    La stampa non rimane in coda cmq per lui è stata fatta.

    Da cosa può dipendere?

    Sul sito microsoft dice questo che però non riesco a capire:

    Nota : non È possibile utilizzare questo approccio nel processo di stampa stesso come un processo di stampa PrintDocument nativo. È necessario utilizzare .NET Framework per stampare o inviare il proprio byte del processo di stampa.

    ????

    Spero potrai aiutarmi!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.