Page 1 of 2

Print system functions

Posted: Tue May 30, 2006 7:49 am
by Badara Thiam

Code: Select all

*******************
FUNCTION WinGetPrnD(cNomDriver)
*******************
* Return the driver filename without his extension

* Recherche le driver d'une imprimante installée sous windows
* dans le registre de Windows (remplace le WIN.INI
* qui est obsolète sous Windows 2000 et suivants)
* Auteur Badara THIAM

LOCAL nHandle
LOCAL cValue
LOCAL n1
LOCAL n2
LOCAL nok
LOCAL nLen
LOCAL cSubkeys
LOCAL cSubkeys2
LOCAL X, X2
LOCAL TENV := {}
LOCAL TENVDRIVER := {}
LOCAL oReg
LOCAL cDriver := ""

cSubKeys := "System\CurrentControlSet\Control\Print\Environments"

IF RegOpenKey( HKEY_LOCAL_MACHINE,  cSubKeys,  @nHandle ) == 0
  SysRefresh()
  n1 := 0
  DO WHILE .T.
    cValue := ""
    n2 := RegEnumKey( nHandle, n1,  @cvalue  )
    IF n2 = 0
      IF ASCAN(TENV, STRTRAN(cValue, "," , "\")) = 0
        AADD(TENV, STRTRAN(cValue, "," , "\"))
      ENDIF
    ELSE
      EXIT
    ENDIF
    n1 ++
    SysRefresh()
  ENDDO
  RegCloseKey( nHandle )
  SysRefresh()

  FOR X := 1 TO LEN(TENV)
    cSubKeys2 := cSubKeys + "\" + TENV[X] + "\Drivers"

    oReg := TReg32():New(HKEY_LOCAL_MACHINE, cSubKeys2 + "\" + cNomDriver)

    IF oReg:nError = 0
      cDriver := oReg:Get("Driver", "")
      oReg:Close()
      oReg := NIL
      IF !EMPTY(cDriver)
        cDriver := IIF("." $ cDriver, LEFT(cDriver, AT(".", cDriver) - 1), cDriver)
        EXIT
      ENDIF
    ELSE
      oReg:Close()
      oReg := NIL
      IF RegOpenKey( HKEY_LOCAL_MACHINE,  cSubKeys2,  @nHandle ) == 0
        n1 := 0
        TENVDRIVER := {}
        DO WHILE .T.
          cValue := ""
          n2 := RegEnumKey( nHandle, n1,  @cvalue  )
          IF n2 = 0
            IF ASCAN(TENVDRIVER, STRTRAN(cValue, "," , "\")) = 0
              AADD(TENVDRIVER, STRTRAN(cValue, "," , "\"))
            ENDIF
          ELSE
            EXIT
          ENDIF
          SysRefresh()
          n1 ++
        ENDDO
        RegCloseKey( nHandle )
        SysRefresh()

        FOR X2 := 1 TO LEN(TENVDRIVER)

          oReg := TReg32():New(HKEY_LOCAL_MACHINE, cSubKeys2 + "\" + TENVDRIVER[X2] + "\" + cNomDriver)
          IF oReg:nError = 0
            cDriver := oReg:Get("Driver", "")
            oReg:Close()
            oReg := NIL
            IF !EMPTY(cDriver)
              cDriver := IIF("." $ cDriver, LEFT(cDriver, AT(".", cDriver) - 1), cDriver)
              EXIT
            ENDIF
          ELSE
            oReg:Close()
            oReg := NIL
          ENDIF
          SysRefresh()

        NEXT X2
        IF !EMPTY(cDriver)
          EXIT
        ENDIF
      ENDIF
    ENDIF
    SysRefresh()
  NEXT X
ENDIF
SysRefresh()
RETURN cDriver


*******************
FUNCTION WinGetPrnP(cNomImpr)
*******************

* Return the driver filename and the port of any printer

* Renvoie le (nom du fichier) Driver et le Port de l'imprimante
* dont le nom est le contenu de cNomImpr.
* Le Driver et le Port sont renvoyés dans une chaine,
* séparés par une virgule.
* Auteur Badara THIAM

LOCAL cDriver := ""
LOCAL cNomDriver := ""
LOCAL cPort := ""
LOCAL oReg
LOCAL X
LOCAL TIMP := WINGETPRN()

* Recherche l'imprimante Windows ayant le même nom,
* en convertissant en minuscule et en supprimant les espaces
FOR X := 1 TO LEN(TIMP)
  IF MEMEIMPRIM(@cNomImpr, TIMP[X])
  * Si c'est la même imprimante
    EXIT
  ENDIF
NEXT X

IF X <= LEN(TIMP)

  oReg := TReg32():New(HKEY_LOCAL_MACHINE,;
  "System\CurrentControlSet\Control\Print\Printers\" + STRTRAN(TIMP[X],"\",","))


  IF oReg:nError = 0
    cPort := oReg:Get("Port", "")
    cNomDriver := oReg:Get("Printer Driver", "")
  ENDIF
  oReg:Close()
  oReg := NIL

  IF cNomDriver != ""
    cDriver := WINGETPRND(@cNomDriver)
  ENDIF
ENDIF
RETURN cDriver + "," + cPort

Posted: Tue May 30, 2006 8:10 am
by Badara Thiam

Code: Select all

*******************
FUNCTION MEMEIMPRIM(cImp1, cImp2)
*******************
* Return .T. if the two printers names are the sames
* when we delete the spaces and upper <-> lower
* and changing "/" by "," if "/" is in the printer name

* Renvoie .T. si les deux noms d'imprimantes
* correspondent à la même imprimante,
* en ignorant les espaces et la casse
* et en remplaçant "/" par "," si présent dans le nom de l'imprimante

RETURN ( LOWER(STRTRAN(STRTRAN(cImp1, "\", ","), " ", "")) == LOWER(STRTRAN(STRTRAN(cImp2, "\", ","), " ","")) )

Posted: Tue May 30, 2006 8:15 am
by Badara Thiam

Code: Select all

****************** 
FUNCTION WinDefPrn() 
****************** 
* To replace PrnGetName(), failed function of Fivewin 2.5 
* Return the name of the default Windows printer 
* by take it directly in the Windows registry 

* Pour remplacer la fonction défaillante PrnGetName() de Fivewin 2.5 
* Retourne le nom de l'imprimante par défaut 
* en le prenant directement dans le registre Windows 
* Auteur Badara Thiam

LOCAL cDefPrn := "" 
LOCAL oReg := TReg32():New(HKEY_CURRENT_CONFIG, "System\CurrentControlSet\Control\Print\Printers") 
IF oReg:nError = 0 
  cDefPrn := oReg:Get("Default", "") 
ENDIF 
oReg:Close() 
oReg := NIL 
RETURN cDefPrn

Posted: Tue May 30, 2006 8:22 am
by Badara Thiam

Code: Select all

****************** 
FUNCTION WINGETPRN() 
******************

* Return all printers the user can access under Windows

* Recherche les imprimantes installées sous windows 
* dans le registre de Windows (remplace le WIN.INI 
* qui est obsolète sous Windows 2000 et suivants) 
* Auteur Badara Thiam 

LOCAL TIMP := {} 
LOCAL nHandle 
LOCAL cValue 
LOCAL n1 
LOCAL n2 
LOCAL nok 
LOCAL nLen 
LOCAL cSubkeys 
LOCAL aHKey := HKEY_LOCAL_MACHINE 

cSubKeys := "System\CurrentControlSet\Control\Print\Printers" 

IF RegOpenKey( aHKey, cSubKeys, @nHandle ) == 0 
  n1 := 0 
  DO WHILE .T. 
    cValue := "" 
    n2 := RegEnumKey( nHandle, n1, @cvalue ) 
    IF n2 = 0 
      IF ASCAN(TIMP, STRTRAN(cValue, "," , "\")) = 0 
        AADD(TIMP, STRTRAN(cValue, "," , "\")) 
      ENDIF 
    ELSE 
      EXIT 
    ENDIF 
    n1 ++ 
  ENDDO 
  RegCloseKey( nHandle ) 
ENDIF 
RETURN ACLONE(TIMP)


Posted: Sun Jun 04, 2006 7:20 am
by Antonio Linares
Badara,

Thanks for your contributions,

Posted: Fri Oct 06, 2006 8:03 pm
by Gilbert
Bonjour Badara,


En fouillant sur le forum je suis tomber sur cet interessant message qui pour moi peut-être une solution à plusieurs problèmes surtout au niveau de la gestion des imprimantes sous Windows.

Je voudrais savoir si les solutions présenté fonctionnent aussi sur Win98 et XP


Merci

Gilbert :D

Posted: Sat Oct 07, 2006 11:21 am
by Badara Thiam
My next message was here also

Posted: Sat Oct 07, 2006 11:24 am
by Badara Thiam
Bonjour Gilbert,

Ça doit fonctionner de la même façon sous tous les Windows ayant un registre, sinon c'est que l'adressage dans le registre est différent
pour certains Windows. Pour le vérifier, ouvre le registre (regedit.exe)
et ouvre les chemins que tente d'utiliser WinGetPrn() pour aller
chercher l'information là où elle est. Si tu trouves bien l'information
recherchée, WinGetPrn() la trouveras.

J'utilise depuis plusieurs années WinGetPrn() et les autres que j'ai fourni sur le forum Fivewin, et aucun problème signalé par mes clients depuis
maintenant plus de 6 mois à ce sujet, après de nombreuses recherches
et mises au point.

Ces fonctions d'impression peuvent aussi servir sous FWH
ou tout autre outil permettant l'accès au registre Windows.

Merci de me signaler le moindre problème que tu pourrais rencontrer
avec ces fonctions, je me ferai un devoir de le régler au plus vite,
ne serait-ce que pour mes clients...

Posted: Sat Oct 21, 2006 10:35 am
by Badara Thiam
Hello,

I have rewritted the functions WinGetPrn() and WinGetPrnP()
because there are some shared printers who are not registered
in the same path in the Windows registry, under NT, XP, and
i think also under 2000, 2003, Vista.

Theses functions must work under all Windows since 95,
else i have something to change.

Thank you to say me any problem found.

Regards,

Code: Select all

******************
FUNCTION WinGetPrn()
******************
* Recherche les imprimantes installées sous windows
* dans le registre de Windows (remplace le WIN.INI qui est obsolète sous Windows 2000 et suivants)
* Auteur Badara Thiam

LOCAL TIMP := {}
LOCAL nHandle
LOCAL cValue
LOCAL n1
LOCAL n2
LOCAL nok
LOCAL nLen
LOCAL cSubkeys
LOCAL aHKey := HKEY_LOCAL_MACHINE
LOCAL TSERVEURS := {}
LOCAL X

* Recherche des imprimantes disponibles depuis le poste courant
cSubKeys := "System\CurrentControlSet\Control\Print\Printers"

IF RegOpenKey( aHKey,  cSubKeys,  @nHandle ) == 0
    n1 := 0
    DO WHILE .T.
      cValue := ""
      n2 := RegEnumKey( nHandle, n1,  @cvalue  )
      SysRefresh()
      IF n2 = 0
        IF ASCAN(TIMP, STRTRAN(cValue, "," , "\")) = 0
          AADD(TIMP, STRTRAN(cValue, "," , "\"))
        ENDIF
      ELSE
        EXIT
      ENDIF
      n1 ++
    ENDDO
    RegCloseKey( nHandle )
ENDIF

* Recherche des imprimantes réseau non répertoriées dans la clé précédente (ci-dessus)
* Ajouté le 20/10/2006
TSERVEURS := WinGetSerP()
IF !EMPTY(TSERVEURS)
  FOR X := 1 TO LEN(TSERVEURS)
    cSubKeys := "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\LanMan Print Services\Servers" ;
    + "\" + TSERVEURS[X] + "\Printers"

    IF RegOpenKey( aHKey,  cSubKeys,  @nHandle ) == 0
      n1 := 0
      DO WHILE .T.
        cValue := ""
        n2 := RegEnumKey( nHandle, n1,  @cvalue  )
        SysRefresh()
        IF n2 = 0
          IF ASCAN(TIMP, STRTRAN(cValue, "," , "\")) = 0
            AADD(TIMP, STRTRAN(cValue, "," , "\"))
          ENDIF
        ELSE
          EXIT
        ENDIF
        n1 ++
      ENDDO
      RegCloseKey( nHandle )
    ENDIF
  NEXT X
ENDIF

RETURN ACLONE(TIMP)

Code: Select all


*******************
FUNCTION WinGetSerP()
*******************
* Renvoie les noms des serveurs d'impression disponibles pour le poste courant
* Auteur Badara Thiam
LOCAL nHandle
LOCAL cValue
LOCAL n1
LOCAL n2
LOCAL cSubkeys
LOCAL aHKey := HKEY_LOCAL_MACHINE
LOCAL TSERVEURS := {}

cSubKeys := "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\LanMan Print Services\Servers"
IF RegOpenKey( aHKey,  cSubKeys,  @nHandle ) == 0

    * Recherche des serveurs accessibles
    n1 := 0
    TSERVEURS := {}
    DO WHILE .T.
      cValue := ""
      n2 := RegEnumKey( nHandle, n1,  @cvalue  )
      SysRefresh()
      IF n2 = 0
        AADD(TSERVEURS, cValue)
      ELSE
        EXIT
      ENDIF
      n1 ++
    ENDDO

    RegCloseKey( nHandle )
ENDIF
RETURN ACLONE(TSERVEURS)

Code: Select all


*******************
FUNCTION WinGetPrnD(cNomDriver)
*******************
* Recherche le driver d'une imprimante installée sous windows
* dans le registre de Windows (remplace le WIN.INI qui est obsolète sous Windows 2000 et suivants)
* Auteur Badara THIAM

LOCAL nHandle
LOCAL cValue
LOCAL n1
LOCAL n2
LOCAL nok
LOCAL nLen
LOCAL cSubkeys
LOCAL cSubkeys2
LOCAL X, X2
LOCAL TENV := {}
LOCAL TENVDRIVER := {}
LOCAL oReg
LOCAL cDriver := ""

cSubKeys := "System\CurrentControlSet\Control\Print\Environments"

IF RegOpenKey( HKEY_LOCAL_MACHINE,  cSubKeys,  @nHandle ) == 0
  SysRefresh()
  n1 := 0
  DO WHILE .T.
    cValue := ""
    n2 := RegEnumKey( nHandle, n1,  @cvalue  )
    IF n2 = 0
      IF ASCAN(TENV, STRTRAN(cValue, "," , "\")) = 0
        AADD(TENV, STRTRAN(cValue, "," , "\"))
      ENDIF
    ELSE
      EXIT
    ENDIF
    n1 ++
    SysRefresh()
  ENDDO
  RegCloseKey( nHandle )
  SysRefresh()

  FOR X := 1 TO LEN(TENV)
    cSubKeys2 := cSubKeys + "\" + TENV[X] + "\Drivers"

    oReg := TReg32():New(HKEY_LOCAL_MACHINE, cSubKeys2 + "\" + cNomDriver)

    IF oReg:nError = 0
      cDriver := oReg:Get("Driver", "")
      oReg:Close()
      oReg := NIL
      IF !EMPTY(cDriver)
        cDriver := IIF("." $ cDriver, LEFT(cDriver, AT(".", cDriver) - 1), cDriver)
        EXIT
      ENDIF
    ELSE
      oReg:Close()
      oReg := NIL
      IF RegOpenKey( HKEY_LOCAL_MACHINE,  cSubKeys2,  @nHandle ) == 0
        n1 := 0
        TENVDRIVER := {}
        DO WHILE .T.
          cValue := ""
          n2 := RegEnumKey( nHandle, n1,  @cvalue  )
          IF n2 = 0
            IF ASCAN(TENVDRIVER, STRTRAN(cValue, "," , "\")) = 0
              AADD(TENVDRIVER, STRTRAN(cValue, "," , "\"))
            ENDIF
          ELSE
            EXIT
          ENDIF
          SysRefresh()
          n1 ++
        ENDDO
        RegCloseKey( nHandle )
        SysRefresh()

        FOR X2 := 1 TO LEN(TENVDRIVER)

          oReg := TReg32():New(HKEY_LOCAL_MACHINE, cSubKeys2 + "\" + TENVDRIVER[X2] + "\" + cNomDriver)
          IF oReg:nError = 0
            cDriver := oReg:Get("Driver", "")
            oReg:Close()
            oReg := NIL
            IF !EMPTY(cDriver)
              cDriver := IIF("." $ cDriver, LEFT(cDriver, AT(".", cDriver) - 1), cDriver)
              EXIT
            ENDIF
          ELSE
            oReg:Close()
            oReg := NIL
          ENDIF
          SysRefresh()

        NEXT X2
        IF !EMPTY(cDriver)
          EXIT
        ENDIF
      ENDIF
    ENDIF
    SysRefresh()
  NEXT X
ENDIF
SysRefresh()
RETURN cDriver

Code: Select all


*******************
FUNCTION WinGetPrnP(cNomImpr)
*******************
* Renvoie le (nom du fichier) Driver et le Port de l'imprimante dont le nom est le contenu de cNomImpr.
* Le Driver et le Port sont renvoyés dans une chaine, séparés par une virgule.
* Auteur Badara THIAM

LOCAL cDriver := ""
LOCAL cNomDriver := ""
LOCAL cPort := ""
LOCAL oReg
LOCAL X
LOCAL Y
LOCAL TIMP := WinGetPrn()
LOCAL TSERVEURS := {}

* Recherche l'imprimante Windows ayant le même nom,
* en convertissant en minuscule et en supprimant les espaces
FOR X := 1 TO LEN(TIMP)
  IF MEMEIMPRIM(@cNomImpr, TIMP[X])
  * Si c'est la même imprimante
    EXIT
  ENDIF
NEXT X

IF X <= LEN(TIMP)

  oReg := TReg32():New(HKEY_LOCAL_MACHINE,;
  "System\CurrentControlSet\Control\Print\Printers\" + STRTRAN(TIMP[X],"\",","))

  IF oReg:nError <> 0

    * Recherche les imprimantes réseau non répertoriées (ajouté le 20/10/2006)
    oReg:Close()
    oReg := NIL
    TSERVEURS := WinGetSerP()

    FOR Y := 1 TO LEN(TSERVEURS)

      oReg := TReg32():New(HKEY_LOCAL_MACHINE,;
      "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\LanMan Print Services\Servers" ;
      + "\" + TSERVEURS[Y] + "\Printers\" + STRTRAN(TIMP[X],"\",","))

      IF oReg:nError = 0
        EXIT
      ELSE
        oReg:Close()
        oReg := NIL
      ENDIF
    NEXT Y

  ENDIF
  IF oReg != NIL
    IF oReg:nError = 0
      cPort := oReg:Get("Port", "")
      cNomDriver := oReg:Get("Printer Driver", "")
    ENDIF
    oReg:Close()
    oReg := NIL
  ENDIF
  IF cNomDriver != ""
    cDriver := WinGetPrnD(@cNomDriver)
  ENDIF
ENDIF
RETURN cDriver + "," + cPort

Posted: Thu Oct 26, 2006 11:40 am
by Badara Thiam
Hello,

After news severals tests, there is now a new upgrade,
specialy for Windows 32 bits operating systems
and only about shared printers.

Regards,

Code: Select all

******************
FUNCTION WinGetPrn()
******************
* Recherche les imprimantes installées sous windows
* dans le registre de Windows (remplace le WIN.INI qui est obsolète sous Windows 2000 et suivants)
* Auteur Badara Thiam

LOCAL TIMP := {}
LOCAL nHandle
LOCAL cValue
LOCAL n1
LOCAL n2
LOCAL nok
LOCAL nLen
LOCAL cSubkeys
LOCAL aHKey := HKEY_LOCAL_MACHINE
LOCAL TSERVEURS := {}
LOCAL X

* Recherche des imprimantes disponibles depuis le poste courant
cSubKeys := "System\CurrentControlSet\Control\Print\Printers"

IF RegOpenKey( aHKey,  cSubKeys,  @nHandle ) == 0
    n1 := 0
    DO WHILE .T.
      cValue := ""
      n2 := RegEnumKey( nHandle, n1,  @cvalue  )
      SysRefresh()
      IF n2 = 0
        IF ASCAN(TIMP, STRTRAN(cValue, "," , "\")) = 0
          AADD(TIMP, STRTRAN(cValue, "," , "\"))
        ENDIF
      ELSE
        EXIT
      ENDIF
      n1 ++
    ENDDO
    RegCloseKey( nHandle )
ENDIF

* Recherche des imprimantes réseau non répertoriées dans la clé précédente (ci-dessus)
* Ajouté le 20/10/2006
TSERVEURS := WinGetSerP()
IF !EMPTY(TSERVEURS)
  FOR X := 1 TO LEN(TSERVEURS)
    cSubKeys := "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\LanMan Print Services\Servers" ;
    + "\" + TSERVEURS[X] + "\Printers"

    IF RegOpenKey( aHKey,  cSubKeys,  @nHandle ) == 0
      n1 := 0
      DO WHILE .T.
        cValue := ""
        n2 := RegEnumKey( nHandle, n1,  @cvalue  )
        SysRefresh()
        IF n2 = 0
          IF ASCAN(TIMP, STRTRAN(cValue, "," , "\")) = 0
            IF "," $ cValue
              AADD(TIMP, STRTRAN(cValue, "," , "\"))
            ELSE
              AADD(TIMP, "\\" + TSERVEURS[X] + "\" + cValue)
            ENDIF
          ENDIF
        ELSE
          EXIT
        ENDIF
        n1 ++
      ENDDO
      RegCloseKey( nHandle )
    ENDIF
  NEXT X
ENDIF

RETURN ACLONE(TIMP)

Code: Select all


*******************
FUNCTION WinGetSerP()
*******************
* Renvoie les noms des serveurs d'impression disponibles pour le poste courant
* Auteur Badara Thiam
LOCAL nHandle
LOCAL cValue
LOCAL n1
LOCAL n2
LOCAL cSubkeys
LOCAL aHKey := HKEY_LOCAL_MACHINE
LOCAL TSERVEURS := {}

cSubKeys := "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\LanMan Print Services\Servers"
IF RegOpenKey( aHKey,  cSubKeys,  @nHandle ) == 0

    * Recherche des serveurs accessibles
    n1 := 0
    TSERVEURS := {}
    DO WHILE .T.
      cValue := ""
      n2 := RegEnumKey( nHandle, n1,  @cvalue  )
      SysRefresh()
      IF n2 = 0
        AADD(TSERVEURS, cValue)
      ELSE
        EXIT
      ENDIF
      n1 ++
    ENDDO

    RegCloseKey( nHandle )
ENDIF
RETURN ACLONE(TSERVEURS)

Code: Select all


*******************
FUNCTION WinGetPrnD(cNomDriver)
*******************
* Recherche le driver d'une imprimante installée sous windows
* dans le registre de Windows (remplace le WIN.INI qui est obsolète sous Windows 2000 et suivants)
* Auteur Badara THIAM

LOCAL nHandle
LOCAL cValue
LOCAL n1
LOCAL n2
LOCAL nok
LOCAL nLen
LOCAL cSubkeys
LOCAL cSubkeys2
LOCAL X, X2
LOCAL TENV := {}
LOCAL TENVDRIVER := {}
LOCAL oReg
LOCAL cDriver := ""

cSubKeys := "System\CurrentControlSet\Control\Print\Environments"

IF RegOpenKey( HKEY_LOCAL_MACHINE,  cSubKeys,  @nHandle ) == 0
  SysRefresh()
  n1 := 0
  DO WHILE .T.
    cValue := ""
    n2 := RegEnumKey( nHandle, n1,  @cvalue  )
    IF n2 = 0
      IF ASCAN(TENV, STRTRAN(cValue, "," , "\")) = 0
        AADD(TENV, STRTRAN(cValue, "," , "\"))
      ENDIF
    ELSE
      EXIT
    ENDIF
    n1 ++
    SysRefresh()
  ENDDO
  RegCloseKey( nHandle )
  SysRefresh()

  FOR X := 1 TO LEN(TENV)
    cSubKeys2 := cSubKeys + "\" + TENV[X] + "\Drivers"

    oReg := TReg32():New(HKEY_LOCAL_MACHINE, cSubKeys2 + "\" + cNomDriver)

    IF oReg:nError = 0
      cDriver := oReg:Get("Driver", "")
      oReg:Close()
      oReg := NIL
      IF !EMPTY(cDriver)
        cDriver := IIF("." $ cDriver, LEFT(cDriver, AT(".", cDriver) - 1), cDriver)
        EXIT
      ENDIF
    ELSE
      oReg:Close()
      oReg := NIL
      IF RegOpenKey( HKEY_LOCAL_MACHINE,  cSubKeys2,  @nHandle ) == 0
        n1 := 0
        TENVDRIVER := {}
        DO WHILE .T.
          cValue := ""
          n2 := RegEnumKey( nHandle, n1,  @cvalue  )
          IF n2 = 0
            IF ASCAN(TENVDRIVER, STRTRAN(cValue, "," , "\")) = 0
              AADD(TENVDRIVER, STRTRAN(cValue, "," , "\"))
            ENDIF
          ELSE
            EXIT
          ENDIF
          SysRefresh()
          n1 ++
        ENDDO
        RegCloseKey( nHandle )
        SysRefresh()

        FOR X2 := 1 TO LEN(TENVDRIVER)

          oReg := TReg32():New(HKEY_LOCAL_MACHINE, cSubKeys2 + "\" + TENVDRIVER[X2] + "\" + cNomDriver)
          IF oReg:nError = 0
            cDriver := oReg:Get("Driver", "")
            oReg:Close()
            oReg := NIL
            IF !EMPTY(cDriver)
              cDriver := IIF("." $ cDriver, LEFT(cDriver, AT(".", cDriver) - 1), cDriver)
              EXIT
            ENDIF
          ELSE
            oReg:Close()
            oReg := NIL
          ENDIF
          SysRefresh()

        NEXT X2
        IF !EMPTY(cDriver)
          EXIT
        ENDIF
      ENDIF
    ENDIF
    SysRefresh()
  NEXT X
ENDIF
SysRefresh()
RETURN cDriver

Code: Select all


*******************
FUNCTION WinGetPrnP(cNomImpr)
*******************
* Renvoie le (nom du fichier) Driver et le Port de l'imprimante dont le nom est le contenu de cNomImpr.
* Le Driver et le Port sont renvoyés dans une chaine, séparés par une virgule.
* Auteur Badara THIAM

LOCAL cDriver := ""
LOCAL cNomDriver := ""
LOCAL cPort := ""
LOCAL oReg
LOCAL X
LOCAL Y
LOCAL TIMP := WinGetPrn()
LOCAL TSERVEURS := {}

* Recherche l'imprimante Windows ayant le même nom,
* en convertissant en minuscule et en supprimant les espaces
FOR X := 1 TO LEN(TIMP)
  IF MEMEIMPRIM(@cNomImpr, TIMP[X])
  * Si c'est la même imprimante
    EXIT
  ENDIF
NEXT X

IF X <= LEN(TIMP)

  oReg := TReg32():New(HKEY_LOCAL_MACHINE,;
  "System\CurrentControlSet\Control\Print\Printers\" + STRTRAN(TIMP[X],"\",","))

  IF oReg:nError <> 0

    * Recherche les imprimantes réseau non répertoriées (ajouté le 20/10/2006)
    oReg:Close()
    oReg := NIL
    TSERVEURS := WinGetSerP()

    FOR Y := 1 TO LEN(TSERVEURS)

      oReg := TReg32():New(HKEY_LOCAL_MACHINE,;
      "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\LanMan Print Services\Servers" ;
      + "\" + TSERVEURS[Y] + "\Printers\" + STRTRAN(TIMP[X],"\",","))

      IF oReg:nError = 0
        EXIT
      ELSEIF "\" $ TIMP[X]
        * Si "\" est présent dans le nom d'imprimante, c'est "peut-être" la fonction WinGetPrn()
        * qui a inséré le nom de serveur dans le nom d'imprimante. Pour le vérifier,
        * recherche également le nom de l'imprimante sans le nom de serveur
        oReg:Close()
        oReg := NIL
        oReg := TReg32():New(HKEY_LOCAL_MACHINE,;
        "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\LanMan Print Services\Servers" ;
        + "\" + TSERVEURS[Y] + "\Printers\" + SUBSTR(TIMP[X], RAT("\",TIMP[X]) + 1 ) )
        IF oReg:nError = 0
          EXIT
        ENDIF
      ENDIF
      oReg:Close()
      oReg := NIL
    NEXT Y

  ENDIF
  IF oReg != NIL
    IF oReg:nError = 0
      cPort := oReg:Get("Port", "")
      cNomDriver := oReg:Get("Printer Driver", "")
    ENDIF
    oReg:Close()
    oReg := NIL
  ENDIF
  IF cNomDriver != ""
    cDriver := WinGetPrnD(@cNomDriver)
  ENDIF
ENDIF
RETURN cDriver + "," + cPort

Posted: Fri Nov 17, 2006 9:53 am
by Badara Thiam
Hello,

Here is an upgrade of WinDefPrn(), made to work
with Windows 2000 operating systems.

Thank to Gilbert for his good seek ! :idea:

( the registry is not "easy to eat" )

Regards,

Code: Select all

******************
FUNCTION WinDefPrn()
******************
* Dernière modification le 17/11/2006
* Retourne le nom de l'imprimante par défaut en allant le chercher dans le registre Windows
* (regedit.exe)
LOCAL cDefPrn := ""
* Adresse dans le registre pour Windows 2000 et suivants
LOCAL oReg := TReg32():New(HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Windows")
IF oReg:nError = 0
  cDefPrn := oReg:Get("Device", "")
  IF "," $ cDefPrn
    * Suppression du Pilote et du Port, non requis ici
    cDefPrn := LEFT(cDefPrn, AT(",",cDefPrn) -1)
  ENDIF
ELSE
  * Alternative pour Windows 9x et Millennium
  oReg:Close()
  oReg := NIL
  oReg := TReg32():New(HKEY_CURRENT_CONFIG, "System\CurrentControlSet\Control\Print\Printers")
  IF oReg:nError = 0
    cDefPrn := oReg:Get("Default", "")
  ENDIF
ENDIF
oReg:Close()
oReg := NIL
RETURN cDefPrn



Posted: Mon Nov 03, 2008 7:27 am
by anserkk
Dear Badara,

I am getiing a variable does not exist error when I try your functions from this thread

For Eg: WinDefPrn() gives a variable dows not exist HKEY_CURRENT_USER from the line

LOCAL oReg := TReg32():New(HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Windows")

I am getting same errors wherever there is a

New(HKEY_CURRENT_CONFIG, "System\CurrentControlSet\Control\Print\Printers")


Any idea what could be the reason ?

I am using FWH 8.08 with xHarbour in Windows XP. Are these fuctions supposed to be used only with FW and Clipper ?

Regards

Anser

Posted: Mon Nov 03, 2008 7:39 am
by anserkk
Hi,

I undestood that the problem was because I don't have # Defines

#define HKEY_LOCAL_MACHINE 2147483650

Any idea from where can I get the # define values for HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG etc.

Regards

Anser

Posted: Mon Nov 03, 2008 7:55 am
by anserkk
Frirends I got it

Code: Select all

#ifndef __XPP__
   #define  HKEY_CLASSES_ROOT       2147483648
   #define  HKEY_CURRENT_USER       2147483649
   #define  HKEY_LOCAL_MACHINE      2147483650
   #define  HKEY_USERS              2147483651
   #define  HKEY_PERFORMANCE_DATA   2147483652
   #define  HKEY_CURRENT_CONFIG     2147483653
   #define  HKEY_DYN_DATA           2147483654
#else
   #define  HKEY_CLASSES_ROOT       1
   #define  HKEY_CURRENT_USER       2
   #define  HKEY_LOCAL_MACHINE      3
   #define  HKEY_USERS              4
   #define  HKEY_PERFORMANCE_DATA   5
   #define  HKEY_CURRENT_CONFIG     6
   #define  HKEY_DYN_DATA           7
#endif
Regards

Anser

Posted: Mon Nov 03, 2008 11:28 am
by Badara Thiam
anserkk,

Sorry i have forgotten to include these define.

I have updated these functions to work properly
under all Windows (tested by myself on 98, XP, Vista).
The new code of these functions work with Clipper
and with [x]Harbour !

I will post here soon.
Regards,