Print system functions

Print system functions

Postby Badara Thiam » Tue May 30, 2006 7:49 am

Code: Select all  Expand view  RUN
*******************
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
Badara Thiam
http://www.icim.fr
User avatar
Badara Thiam
 
Posts: 160
Joined: Tue Oct 18, 2005 10:21 am
Location: France

Postby Badara Thiam » Tue May 30, 2006 8:10 am

Code: Select all  Expand view  RUN
*******************
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, "\", ","), " ","")) )
Badara Thiam
http://www.icim.fr
User avatar
Badara Thiam
 
Posts: 160
Joined: Tue Oct 18, 2005 10:21 am
Location: France

Postby Badara Thiam » Tue May 30, 2006 8:15 am

Code: Select all  Expand view  RUN
******************
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
Badara Thiam
http://www.icim.fr
User avatar
Badara Thiam
 
Posts: 160
Joined: Tue Oct 18, 2005 10:21 am
Location: France

Postby Badara Thiam » Tue May 30, 2006 8:22 am

Code: Select all  Expand view  RUN
******************
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)

Badara Thiam
http://www.icim.fr
User avatar
Badara Thiam
 
Posts: 160
Joined: Tue Oct 18, 2005 10:21 am
Location: France

Postby Antonio Linares » Sun Jun 04, 2006 7:20 am

Badara,

Thanks for your contributions,
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42111
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Gilbert » Fri Oct 06, 2006 8:03 pm

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
Gilbert Vaillancourt
turbolog@videotron.ca
Gilbert
 
Posts: 74
Joined: Thu Oct 20, 2005 4:30 pm
Location: Canada

Postby Badara Thiam » Sat Oct 07, 2006 11:21 am

My next message was here also
Last edited by Badara Thiam on Sat Oct 07, 2006 2:37 pm, edited 2 times in total.
Badara Thiam
http://www.icim.fr
User avatar
Badara Thiam
 
Posts: 160
Joined: Tue Oct 18, 2005 10:21 am
Location: France

Postby Badara Thiam » Sat Oct 07, 2006 11:24 am

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...
Badara Thiam
http://www.icim.fr
User avatar
Badara Thiam
 
Posts: 160
Joined: Tue Oct 18, 2005 10:21 am
Location: France

Postby Badara Thiam » Sat Oct 21, 2006 10:35 am

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  Expand view  RUN
******************
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  Expand view  RUN

*******************
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  Expand view  RUN

*******************
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  Expand view  RUN

*******************
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
Badara Thiam
http://www.icim.fr
User avatar
Badara Thiam
 
Posts: 160
Joined: Tue Oct 18, 2005 10:21 am
Location: France

Postby Badara Thiam » Thu Oct 26, 2006 11:40 am

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  Expand view  RUN
******************
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  Expand view  RUN

*******************
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  Expand view  RUN

*******************
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  Expand view  RUN

*******************
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
Badara Thiam
http://www.icim.fr
User avatar
Badara Thiam
 
Posts: 160
Joined: Tue Oct 18, 2005 10:21 am
Location: France

Postby Badara Thiam » Fri Nov 17, 2006 9:53 am

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  Expand view  RUN
******************
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


Badara Thiam
http://www.icim.fr
User avatar
Badara Thiam
 
Posts: 160
Joined: Tue Oct 18, 2005 10:21 am
Location: France

Postby anserkk » Mon Nov 03, 2008 7:27 am

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
User avatar
anserkk
 
Posts: 1333
Joined: Fri Jun 13, 2008 11:04 am
Location: Kochi, India

Postby anserkk » Mon Nov 03, 2008 7:39 am

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
User avatar
anserkk
 
Posts: 1333
Joined: Fri Jun 13, 2008 11:04 am
Location: Kochi, India

Postby anserkk » Mon Nov 03, 2008 7:55 am

Frirends I got it

Code: Select all  Expand view  RUN
#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
User avatar
anserkk
 
Posts: 1333
Joined: Fri Jun 13, 2008 11:04 am
Location: Kochi, India

Postby Badara Thiam » Mon Nov 03, 2008 11:28 am

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,
Badara Thiam
http://www.icim.fr
User avatar
Badara Thiam
 
Posts: 160
Joined: Tue Oct 18, 2005 10:21 am
Location: France

Next

Return to FiveWin for CA-Clipper

Who is online

Users browsing this forum: No registered users and 9 guests