patrice33740 Avec la réponse, c'est facile. | Bonjour,
Un vieux code que fonctionne toujours en 32 bits (à adapter si 64 bits) :
Code :
- Option Explicit
- Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" _
- (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
- Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
- 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
- Type Imprimante_1
- flags As Long
- pDescription As String
- pName As String
- pComment As String
- End Type
- Function EnumèreImprimantes() As String
- ' Objet : Liste les imprimantes installées
- '
- ' Retour : String Liste des noms des imprimantes installées ou chaine vide si
- ' aucune imprimante n'est installée.
- '
- ' 04/07/07 Patrice Création
-
- Dim BufferLong() As Long ' Tableau qui reçoit les informations de EnumPrinters
- Dim Données() As Imprimante_1 ' Recoit les valeurs de BufferLong()
- Dim TailleBuffer As Long ' Taille en bytes de BufferLong()
- Dim BesoinBuffer As Long ' Nbre de bytes necessaires si BufferLong() trop court
- Dim NbImprimantes As Long ' Nbre d'imprimantes trouvées
- Dim Résultat As Long ' Résultat retournée
- Dim Compteur As Integer ' Compteur
- EnumèreImprimantes = ""
- ' Récolte les informations sur les imprimantes locales
- TailleBuffer = 1200 ' Taille assez importante mais pas trop
- ReDim BufferLong(0 To TailleBuffer / 4) As Long ' Redimension buffer (1 Long = 4 bytes)
- Résultat = EnumPrinters(2, "", 1, BufferLong(0), TailleBuffer, BesoinBuffer, NbImprimantes)
- If Résultat = 0 Then
- TailleBuffer = BesoinBuffer
- ReDim BufferLong(0 To TailleBuffer / 4) As Long ' Agrandir buffer à la taille nécessaire
- Résultat = EnumPrinters(2, "", 1, BufferLong(0), TailleBuffer, BesoinBuffer, NbImprimantes)
- If Résultat = 0 Then Exit Function ' Si nouvel échec, terminer
- End If
- If NbImprimantes = 0 Then Exit Function
- ' Converti les données de BufferLong() vers Données()
- ReDim Données(0 To NbImprimantes - 1) As Imprimante_1
- ' Boucle qui définit chaque élément à partir du jeu d'informations reçues
- For Compteur = 0 To NbImprimantes - 1
- ' BufferLong(4 * Compteur) = .flags, BufferLong(4 * Compteur + 1) = .pDescription, etc.
- ' Pour chaque élément, la chaine est est d'abord stockée dans le buffer pour disposer
- ' d'assez de place, et alors l'élément est copié. »
- Données(Compteur).flags = BufferLong(4 * Compteur)
- Données(Compteur).pDescription = Space(lstrlen(BufferLong(4 * Compteur + 1)))
- Résultat = lstrcpy(Données(Compteur).pDescription, BufferLong(4 * Compteur + 1))
- Données(Compteur).pName = Space(lstrlen(BufferLong(4 * Compteur + 2)))
- Résultat = lstrcpy(Données(Compteur).pName, BufferLong(4 * Compteur + 2))
- Données(Compteur).pComment = Space(lstrlen(BufferLong(4 * Compteur + 3)))
- Résultat = lstrcpy(Données(Compteur).pComment, BufferLong(4 * Compteur + 3))
- Next Compteur
- ' Renvoie le nom de chaque imprimante
- For Compteur = 0 To NbImprimantes - 1
- EnumèreImprimantes = EnumèreImprimantes & Données(Compteur).pName & vbCr
- Next Compteur
-
- End Function
|
---------------
Cordialement, Patrice
|