• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

GetPrinterFullNames van Chip Pearson

Status
Niet open voor verdere reacties.

AD1957

Verenigingslid
Lid geworden
27 feb 2016
Berichten
2.157
Beste Helpers,

De code van Chip Pearson in het voorbeeldbestand werkt niet op een 64Bit versie.
Is deze aan te passen.
 

Bijlagen

Doe de functie declaraties eens zo:
Code:
#If Win64 Then
    Private Declare PtrSafe Function RegOpenKeyEx Lib "advapi32" _
        Alias "RegOpenKeyExA" ( _
        ByVal hKey As LongPtr, _
        ByVal lpSubKey As String, _
        ByVal ulOptions As Long, _
        ByVal samDesired As Long, _
        phkResult As Long) As LongPtr
    
    Private Declare PtrSafe Function RegEnumValue Lib "advapi32.dll" _
        Alias "RegEnumValueA" ( _
        ByVal hKey As Long, _
        ByVal dwIndex As Long, _
        ByVal lpValueName As String, _
        lpcbValueName As Long, _
        ByVal lpReserved As Long, _
        lpType As Long, _
        lpData As Byte, _
        lpcbData As Long) As Long
    
    Private Declare PtrSafe Function RegCloseKey Lib "advapi32.dll" ( _
        ByVal hKey As LongPtr) As Long
#Else
    Private Declare Function RegOpenKeyEx Lib "advapi32" _
        Alias "RegOpenKeyExA" ( _
        ByVal HKey As Long, _
        ByVal lpSubKey As String, _
        ByVal ulOptions As Long, _
        ByVal samDesired As Long, _
        phkResult As Long) As Long
    
    Private Declare Function RegEnumValue Lib "advapi32.dll" _
        Alias "RegEnumValueA" ( _
        ByVal HKey As Long, _
        ByVal dwIndex As Long, _
        ByVal lpValueName As String, _
        lpcbValueName As Long, _
        ByVal lpReserved As Long, _
        lpType As Long, _
        lpData As Byte, _
        lpcbData As Long) As Long
    
    Private Declare Function RegCloseKey Lib "advapi32.dll" ( _
        ByVal HKey As Long) As Long
#End If
 
Bedankt voor de reactie,

Zal het gaan proberen, moet echter op de PC van mijn zoon.
Aangezien deze een paar dagen weg is kan het even duren.
Laat nog van me horen.
 
Ed heeft deze nog gemist:
Private Declare PtrSafe Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" ( _
ByVal hKey As LongPtr, ByV.......

daarnaast zou je nog in de functie GetPrinterFullnames de dim Hkey aan moeten passen

Code:
#If Win64 Then
  Dim hKey As LongPtr    ' registry key handle
#Else
  Dim hKey As Long    ' registry key handle
#End If

Maar als het gaat om enkel een lijstje van de printers zou ik de api calls links laten liggen en ze middels CreateObject("WScript.Network") oproepen
 
Bril aaan het poetsen... :shocked::D
 
Of eenvoudig:

Code:
Sub M_snb_printers()
  Application.Dialogs(9).Show

  c00 = "Activeprinter:" & vbTab & ActivePrinter & vbLf
  With CreateObject("Wscript.network")
    For j = 0 To .EnumPrinterConnections.Count - 1 Step 2
      c00 = c00 & vbLf & .EnumPrinterConnections(j + 1) & " on " & .EnumPrinterConnections(j)
    Next
  End With
  MsgBox c00
End Sub
 
Na de aanpassingen van Edmoor en Evr werkt de code van Pearson nog steeds niet op een 64Bits versie.
Inmiddels nog een code gevonden van alphamax.,deze nog niet kunnen testen op de 64 Bits versie, maar ik verwacht dat deze wel gaat werken.
Zie verder Blad1.
 

Bijlagen

Probleem met de code van Pearson krijg ikzelf niet opgelost.
Maar met de code van alphamax werkt het perfect.
 
Niet alle API declaraties waren goed ingesteld, deze doet het bij mij naar behoren.
 

Bijlagen

Het gebruik zonder API's altijd beter.
 
Ik zou niet weten waarom zonder API's altijd beter is. Het ligt aan je eisen en wensen zou ik zeggen.
 
@snb: jouw code laat bij mij 1 printer minder zien:

API code geeft:
API code.png

code van snb geeft:
snb_code.png

Dit komt door de controle op de aanwezigheid van een spatie in de code van snb :-)
 
Ik zou niet weten waarom zonder API's altijd beter is. Het ligt aan je eisen en wensen zou ik zeggen.
Daar heb je gelijk in, ik bedoel dan ook, als het niet nodig is, niet gebruiken.
 
Zonder spatie-check:

Code:
Sub M_snb_printer_poort()
  Set Sh = CreateObject("wscript.shell")
  c00 = "HKCU\software\Microsoft\Windows NT\Currentversion\Devices\"
   
  With CreateObject("Wscript.network")
    For j = 1 To .EnumPrinterConnections.Count Step 2
      pr = .EnumPrinterConnections(j)
      c01 = c01 & vbLf & pr & " on " & Replace(Sh.regread(c00 & pr), "winspool,", "")
    Next
  End With
  
  MsgBox c01
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan