ACC2000: Enumerar local e de impressoras de rede

Traduções de Artigos Traduções de Artigos
Artigo: 200611 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Avançado: Requer conhecimentos avançados sobre codificação, interoperabilidade e multi-utilizador.

Expandir tudo | Reduzir tudo

Sumário

Este artigo mostra dois procedimentos que utilizar a função de API EnumPrinters para obter uma lista de impressoras disponíveis localmente e também as impressoras numa rede que pode ser ligada ao computador.

Os procedimentos demonstram devolver dados tanto a estrutura PRINTER_INFO_1 e a estrutura PRINTER_INFO_4, cada uma delas fornece ligeiramente diferentes informações sobre a impressora. Se está a utilizar o Microsoft Windows 95 ou posterior, pode devolver dados para a estrutura PRINTER_INFO_1; se estiver a utilizar o Microsoft Windows NT, pode devolver dados para qualquer estrutura.

Mais Informação

A Microsoft fornece exemplos de programação apenas, para fins sem garantia expressa ou implícita. Isto inclui, mas não está limitado a, as garantias implícitas de comercialização ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação apresentada e as ferramentas que são utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas do utilizador. O código de cada um dos dois exemplos executa estes passos:
  • Chama a API EnumPrinters , que devolve uma memória intermédia de dados, um sinalizador de êxito e um sinalizador que indica se a memória intermédia é demasiado pequena.
  • Se a memória intermédia é demasiado pequena, o código torna o tamanho correcto e chama a API novamente.
  • Para cada entrada na memória intermédia, este extrai os dados e imprime-o.
Nota : quando utilizar estas funções nas suas aplicações, poderá pretender voltar uma matriz de dados que podem ser apresentadas numa caixa de listagem ou grelha em vez de imprimir os valores.

A memória intermédia está no formato seguinte:

|rec1|rec2|... |recn|... lixo... |strn|... |str2|str1|
INFO regista ponteiros de cadeia contendo e valores numéricos são adicionados à esquerda e a cadeia de texto para cada registo é adicionada à direita. A área entre o fim do último registo e o início da última cadeia de texto contém lixo.

A memória intermédia é declarada como tipo longo , que facilita extrair dados de registos - todos os campos são longos ou ponteiros (mapa de ponteiros para longo ).

As funções StrLen() e PtrToStr() são utilizadas para definir a variável de cadeia de recepção e para copiar o texto da memória intermédia para a variável.
  1. Crie um módulo e escreva as seguintes linhas na secção Declarations:
    Option Compare Database
    Option Explicit
    
    Const PRINTER_ENUM_CONNECTIONS = &H4
    Const PRINTER_ENUM_LOCAL = &H2
    
    Type PRINTER_INFO_1
       flags As Long
       pDescription As String
       PName As String
       PComment As String
    End Type
    
    Type PRINTER_INFO_4
       pPrinterName As String
       pServerName As String
       Attributes As Long
    End Type
    
    Declare Function EnumPrinters Lib "winspool.drv" Alias _
       "EnumPrintersA" (ByVal flags As Long, ByVal name As String, _
       ByVal Level As Long, pPrinterEnum As Long, ByVal cdBuf As Long, _
       pcbNeeded As Long, pcReturned As Long) As Long
    Declare Function PtrToStr Lib "Kernel32" Alias "lstrcpyA" _
       (ByVal RetVal As String, ByVal Ptr As Long) As Long
    Declare Function StrLen Lib "Kernel32" Alias "lstrlenA" _
       (ByVal Ptr As Long) As Long
    					
  2. Escreva os seguintes procedimentos:
    Sub EnumeratePrintersWin()
    
       Dim Success As Boolean, cbRequired As Long, cbBuffer As Long
       Dim Buffer() As Long, nEntries As Long
       Dim I As Long, PFlags As Long, PDesc As String, PName As String
       Dim PComment As String, Temp As Long
    
       cbBuffer = 3072
       ReDim Buffer((cbBuffer \ 4) - 1) As Long
       Success = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
                             PRINTER_ENUM_LOCAL, _
                             vbNullString, _
                             1, _
                             Buffer(0), _
                             cbBuffer, _
                             cbRequired, _
                             nEntries)
       If Success Then
          If cbRequired > cbBuffer Then
             cbBuffer = cbRequired
             Debug.Print "Buffer too small.  Trying again with " & _
                      cbBuffer & " bytes."
             ReDim Buffer(cbBuffer \ 4) As Long
             Success = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
                                 PRINTER_ENUM_LOCAL, _
                                 vbNullString, _
                                 1, _
                                 Buffer(0), _
                                 cbBuffer, _
                                 cbRequired, _
                                 nEntries)
             If Not Success Then
                Debug.Print "Error enumerating printers."
                Exit Sub
             End If
          End If
       Debug.Print "There are " & nEntries & _
                    " local and connected printers."
       For I = 0 To nEntries - 1
          PFlags = Buffer(4 * I)
          PDesc = Space$(StrLen(Buffer(I * 4 + 1)))
          Temp = PtrToStr(PDesc, Buffer(I * 4 + 1))
          PName = Space$(StrLen(Buffer(I * 4 + 2)))
          Temp = PtrToStr(PName, Buffer(I * 4 + 2))
          PComment = Space$(StrLen(Buffer(I * 4 + 2)))
          Temp = PtrToStr(PComment, Buffer(I * 4 + 2))
          Debug.Print PFlags, PDesc, PName, PComment
       Next I
       Else
          Debug.Print "Error enumerating printers."
       End If
    End Sub
    					

    Sub EnumeratePrintersNT()
    
       Dim Success As Boolean, cbRequired As Long, cbBuffer As Long
       Dim Buffer() As Long, nEntries As Long
       Dim I As Long, PName As String, SName As String
       Dim Attrib As Long, Temp As Long
    
       cbBuffer = 3072
       ReDim Buffer((cbBuffer \ 4) - 1) As Long
       Success = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
                             PRINTER_ENUM_LOCAL, _
                             vbNullString, _
                             4, _
                             Buffer(0), _
                             cbBuffer, _
                             cbRequired, _
                             nEntries)
       If Success Then
          If cbRequired > cbBuffer Then
             cbBuffer = cbRequired
             Debug.Print "Buffer too small.  Trying again with " & _
                      cbBuffer & " bytes."
             ReDim Buffer(cbBuffer \ 4) As Long
             Success = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
                                 PRINTER_ENUM_LOCAL, _
                                 vbNullString, _
                                 4, _
                                 Buffer(0), _
                                 cbBuffer, _
                                 cbRequired, _
                                 nEntries)
             If Not Success Then
                Debug.Print "Error enumerating printers."
                Exit Sub
             End If
          End If
          Debug.Print "There are " & nEntries & _
                    " local and connected printers."
          For I = 0 To nEntries - 1
          PName = Space$(StrLen(Buffer(I * 3)))
          Temp = PtrToStr(PName, Buffer(I * 3))
          SName = Space$(StrLen(Buffer(I * 3 + 1)))
          Temp = PtrToStr(SName, Buffer(I * 3 + 1))
          Attrib = Buffer(I * 3 + 2)
          Debug.Print "Printer: " & PName, "Server: " & SName, _
                      "Attributes: " & Hex$(Attrib)
          Next I
       Else
          Debug.Print "Error enumerating printers."
       End If
    End Sub
    					
  3. Para testar esta função, escreva a seguinte linha na janela Immediate e, em seguida, prima ENTER:
    EnumeratePrintersWIN
    					
    o resultado deverá ser semelhante ao seguinte:
    There are 1 local and connected printers.
    8388608      \\NCPRINT\HP5SI@1155,HP LaserJet 5Si MX,HP5SI@1155
    \\NCPRINT\HP5SI@1155        \\NCPRINT\HP5SI@1155
    						
    Se estiver a utilizar o Microsoft Windows NT, escreva:
    EnumeratePrintersNT
    					
    o resultado deverá ser semelhante ao seguinte:
    There are 1 local and connected printers.
    Printer: \\NCPRINT\HP5SI@1155             Server: \\NCPRINT
    Attributes: 10
    						

Referências

Para mais informações sobre a função EnumPrinters, consulte o SDK do Win32.

Propriedades

Artigo: 200611 - Última revisão: 12 de fevereiro de 2014 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft Access 2000 Standard Edition
Palavras-chave: 
kbnosurvey kbarchive kbmt kbhowto kbnetwork kbprint kbprogramming KB200611 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 200611

Submeter comentários

 

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