Type PRINTER_INFO_2
        pServerName As Long
        pPrinterName As Long
        pShareName As Long
        pPortName As Long
        pDriverName As Long
        pComment As Long
        pLocation As Long
        pDevMode As Long    ' Pointer to DEVMODE
        pSepFile As Long
        pPrintProcessor As Long
        pDatatype As Long
        pParameters As Long
        pSecurityDescriptor As Long ' Pointer to SECURITY_DESCRIPTOR
        Attributes As Long
        Priority As Long
        DefaultPriority As Long
        StartTime As Long
        UntilTime As Long
        Status As Long
        cJobs As Long
        AveragePPM As Long
End Type

Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" _
            (ByVal hPrinter As Long, _
             ByVal Level As Long, _
             pPrinter As Any, _
             ByVal cbBuf As Long, _
             pcbNeeded As Long) As Long


Public Sub GetInfoPrt(ByVal NomeStampante As String, _
                      Percorso As String, _
                      Commento As String, _
                      Tipo As String, _
                      Stato As String)
    Dim pi2 As PRINTER_INFO_2
    Dim hPrinter As Long
    Dim bufSize&
    Dim res&
    Dim st As String
    
    OpenPrinterNull NomeStampante, hPrinter, &H0

    If hPrinter <> 0 Then
        GetPrinter hPrinter, 2, 0, 0, bufSize

        If bufSize > 0 Then
            ReDim Buffer(bufSize) As Byte
            res = GetPrinter(hPrinter, 2, Buffer(0), bufSize, bufSize)

            CopyMemory pi2, Buffer(0), Len(pi2)

            st = String(260, 0)
            
            If pi2.pPortName <> 0 Then
                CopyMemoryPtrToStr st, pi2.pPortName, Len(st) - 1
                Percorso = Left$(st, InStr(st, vbNullChar) - 1)
            End If

            st = String(260, 0)
            
            If pi2.pComment <> 0 Then
                CopyMemoryPtrToStr st, pi2.pComment, Len(st) - 1
                Commento = Left$(st, InStr(st, vbNullChar) - 1)
            End If

            st = String(260, 0)
            If pi2.pPrinterName <> 0 Then
                CopyMemoryPtrToStr st, pi2.pPrinterName, Len(st) - 1
                Tipo = Left$(st, InStr(st, vbNullChar) - 1)
            End If

            Stato = GetStato(pi2.Status, pi2.cJobs, Tipo)
        End If
    End If
    
    ClosePrinter hPrinter

End Sub


Private Function GetStato(ByVal sts As Long, ByVal jobs As Long, ByVal pname As String) As String

    Dim st As String

    If pname = Printer.DeviceName Then
        st = "Stampante predefinita"
    End If

    If sts = 0 Then
        If st <> "" Then st = st & "; "
        st = st & "Pronta."
    Else
        Select Case sts
            Case PRINTER_STATUS_PAUSED: st = "In pausa."
            Case PRINTER_STATUS_ERROR: st = "Errore"
            Case PRINTER_STATUS_PENDING_DELETION: st = "Attesa di cancellazione"
            Case PRINTER_STATUS_PAPER_JAM: st = "Fogli bloccati nella stampante"
            Case PRINTER_STATUS_PAPER_OUT: st = "Carta esaurita"
            Case PRINTER_STATUS_MANUAL_FEED: st = "Manuale"
            Case PRINTER_STATUS_PAPER_PROBLEM: st = "Problema con la carta"
            Case PRINTER_STATUS_OFFLINE: st = "Non collegata"
            Case PRINTER_STATUS_IO_ACTIVE: st = "IO attivo"
            Case PRINTER_STATUS_BUSY: st = "Occupata"
            Case PRINTER_STATUS_PRINTING: st = "Stampa in corso"
            Case PRINTER_STATUS_OUTPUT_BIN_FULL: st = "Cassetto di uscita pieno"
            Case PRINTER_STATUS_NOT_AVAILABLE: st = "Non disponibile"
            Case PRINTER_STATUS_WAITING: st = "Attendere"
            Case PRINTER_STATUS_PROCESSING: st = "Elaborazione in corso"
            Case PRINTER_STATUS_INITIALIZING: st = "Inizializzazione in corso"
            Case PRINTER_STATUS_WARMING_UP: st = "In riscaldamento"
            Case PRINTER_STATUS_TONER_LOW: st = "Toner insufficiente"
            Case PRINTER_STATUS_NO_TONER: st = "Toner esaurito"
            Case PRINTER_STATUS_PAGE_PUNT: st = "No status page"
            Case PRINTER_STATUS_USER_INTERVENTION: st = "Intervento utente"
            Case PRINTER_STATUS_OUT_OF_MEMORY: st = "Memoria insufficiente"
            Case PRINTER_STATUS_DOOR_OPEN: st = "Sportello aperto"
        End Select
        If jobs > 0 Then
            st = st & ";" & Str(jobs) & " documenti in attesa."
        End If
    End If
    
    GetStato = st
    
End Function
