ACC2000: Enumerar local e de impressoras de rede

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.

200611
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.

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 DatabaseOption ExplicitConst PRINTER_ENUM_CONNECTIONS = &H4Const PRINTER_ENUM_LOCAL = &H2Type PRINTER_INFO_1   flags As Long   pDescription As String   PName As String   PComment As StringEnd TypeType PRINTER_INFO_4   pPrinterName As String   pServerName As String   Attributes As LongEnd TypeDeclare 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 LongDeclare Function PtrToStr Lib "Kernel32" Alias "lstrcpyA" _   (ByVal RetVal As String, ByVal Ptr As Long) As LongDeclare 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 IfEnd 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 IfEnd 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: \\NCPRINTAttributes: 10						
Referências
Para mais informações sobre a função EnumPrinters, consulte o SDK do Win32.

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 200611 - Última Revisão: 02/12/2014 21:59:59 - Revisão: 3.2

  • Microsoft Access 2000 Standard Edition
  • kbnosurvey kbarchive kbmt kbhowto kbnetwork kbprint kbprogramming KB200611 KbMtpt
Esta informação foi útil?