IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows 8 Discussion :

Acces à la base de registre par code: HKEY_LOCAL_MACHINE


Sujet :

Windows 8

  1. #1
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut Acces à la base de registre par code: HKEY_LOCAL_MACHINE
    Bonjour,
    je ne parviens pas à lire par code la valeur d'un clé du registre.

    La clé recherchée est dans HKEY_LOCAL_MACHINE, dans SOFTWARE.

    Le code VBA (donc 32 bits) fonctionne parfaitement sous XP et VISTA.

    En WIN8-64, il ne retourne aucune clé alors que le clé recherchée est bien visible via REGEDIT.

    J'ai vu quelquepart qu'on parlait de Wow6432Node au niveau de HKEY_LOCAL_MACHINE\SOFTWARE , mais j'ignore si cela concerne mon problème.
    La clé recherchée est celle de la DLL 64-bit de GHOSTSCRIPT 9.06.

    C'est peut-être simplement la valeur attribué à la constante HKEY_LOCAL_MACHINE qui doit être changée.

    Ci-dessous mon code.

    Merci pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As Any) 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 Any, lpcbData As Long) As Long
    
    
    Function Retrieve_Ghostscript_DLL(gs_pkg As Variant) As Boolean
    Dim hKey As Long, Cnt As Long, sName As String, sData As String, ret As Long, RetData As Long
    Const BUFFER_SIZE As Long = 255
    Const ERROR_NO_MORE_ITEMS = 259&
    Const HKEY_CURRENT_CONFIG = &H80000005
    Const HKEY_LOCAL_MACHINE = &H80000002
    Dim Release As String
    Dim Ghoscript_Key As String
    Dim objWSH As Object
    
    
    
    
    ret = BUFFER_SIZE
    ' "RegEnumKeyEx"
    'Open the registry key
    If RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\GPL Ghostscript", hKey) = 0 Then
        'Create a buffer
        sName = Space(BUFFER_SIZE)
        'Enumerate the keys
        While RegEnumKeyEx(hKey, Cnt, sName, ret, ByVal 0&, vbNullString, ByVal 0&, ByVal 0&) <> ERROR_NO_MORE_ITEMS
        'Show the enumerated key
            Ghoscript_Key = "HKEY_LOCAL_MACHINE\SOFTWARE\GPL Ghostscript\" & Left$(sName, ret) & "\" & "GS_DLL"
            'prepare for the next key
            Cnt = Cnt + 1
            sName = Space(BUFFER_SIZE)
            ret = BUFFER_SIZE
        Wend
        'close the registry key
        RegCloseKey hKey
      Else
        Debug.Print " Error while calling RegOpenKey"
    End If
    
    'Read Ghoscript Key
    Set objWSH = CreateObject("WScript.Shell")
    Retrieve_Ghostscript_DLL = True
    
    On Error Resume Next
     gs_pkg = objWSH.RegRead(Ghoscript_Key)
     If Err.Number <> 0 Then
         MsgBox "Key """ & Ghoscript_Key & """ not inside the registry."
         Retrieve_Ghostscript_DLL = False
         gs_pkg = Null
     End If
     On Error GoTo 0
    
    Set objWSH = Nothing
    
    e_gs_dll:
    End Function
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Il faut utiliser RegOpenKeyEx avec en paramètre KEY_WOW64_64KEY pour forcer la lecture d'une clé 64 bits.
    Mais n'oublie pas que ton application 32 bits sera incapable de charger une DLL 64 bits. Une app. 32 ne peux charger que du 32 (et inversement)

  3. #3
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour et merci pour ta réponse très rapide.

    Je vais faire en conséquence pour que le code fonctionne sur tous les OS.

    Pour ceci :
    Mais n'oublie pas que ton application 32 bits sera incapable de charger une DLL 64 bits. Une app. 32 ne peux charger que du 32 (et inversement)
    la réalité semble différente :
    . j'ai installé GHOSTSCRIPT 64 Bits.
    . j'ai copié la DLL 64 bits dans Windows\system32 sous son nom gsdll64.dll
    . je l'ai copiée une nouvelle fois sous le nom de la DLL 32 bits gsdll32.dll dans windows\system32
    . je lance mon code VBA de conversion potscript en PDF qui utilise uniquement la DLL nommée gsdll32.dll mais qui est juste une copie de la 64bits, et ca marche parfaitement.

    --------Edit - Code Modifié (fonctionne Sous Vista 32-bit, encore à tester sous WIN8-64Bit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Function Retrieve_Ghostscript_DLL(gs_pkg As Variant) As Boolean
    Dim hKey As Long, Cnt As Long, sName As String, sData As String, ret As Long, RetData As Long
    Const BUFFER_SIZE As Long = 255
    Const ERROR_NO_MORE_ITEMS = 259&
    Const HKEY_CURRENT_CONFIG = &H80000005
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const KEY_WOW64_64KEY = &H100
    Const KEY_WOW64_32KEY = &H200
    Dim WOW As Long
    Dim Release As String
    Dim Ghoscript_Key As String
    Dim objWSH As Object
    
    'retrieve OS Characteristics
    Os_fullname = RetrieveWindows(Os_name, Os_bit)
    If Os_bit = "64" Then
        WOW = KEY_WOW64_64KEY
      Else
        WOW = KEY_WOW64_32KEY
    End If
    
    
    
    ret = BUFFER_SIZE
    ' "RegEnumKeyEx"
    'Open the registry key
    
    
    If RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\GPL Ghostscript", 0, WOW, hKey) = 0 Then
        'Create a buffer
        sName = Space(BUFFER_SIZE)
        'Enumerate the keys
        While RegEnumKeyEx(hKey, Cnt, sName, ret, ByVal 0&, vbNullString, ByVal 0&, ByVal 0&) <> ERROR_NO_MORE_ITEMS
        'Show the enumerated key
            Ghoscript_Key = "HKEY_LOCAL_MACHINE\SOFTWARE\GPL Ghostscript\" & Left$(sName, ret) & "\" & "GS_DLL"
            'prepare for the next key
            Cnt = Cnt + 1
            sName = Space(BUFFER_SIZE)
            ret = BUFFER_SIZE
        Wend
        'close the registry key
        RegCloseKey hKey
      Else
        Debug.Print " Error while calling RegOpenKey"
    End If
    
    'Read Ghoscript Key
    Set objWSH = CreateObject("WScript.Shell")
    Retrieve_Ghostscript_DLL = True
    
    On Error Resume Next
     gs_pkg = objWSH.RegRead(Ghoscript_Key)
     If Err.Number <> 0 Then
         MsgBox "Key """ & Ghoscript_Key & """ not inside the registry."
         Retrieve_Ghostscript_DLL = False
         gs_pkg = Null
     End If
     On Error GoTo 0
    
    Set objWSH = Nothing
    
    e_gs_dll:
    End Function
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Godzestla Voir le message
    la réalité semble différente
    Absolument pas ! C'est impossible ! On ne peut pas dans un même processus mélanger un adressage sur 64 bits avec un sur 32.

    Maintenant en voyant ton code, tu ne charges pas directement la DLL comme tu le penses, mais tu l'invoques à travers une interface sur un serveur COM (CreateObject), ce qui n'a rien à voir !
    Renommer la librairie n'a aucun intérêt ! Elle sera toujours en 64 bits.
    Si ça fonctionne, ça veut simplement dire que le serveur COM auquel tu fais appel est bien, lui, en 64 bits

  5. #5
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Tout cela me dépasse. J'ai l'impression d'avoir shooté dans une fourmilière.
    Merci de regarder mon autre poste ou j'explique mes connaissances en système.

    La seule réponse que je peux donner est le code qui utilise la DLL 64bit (gsdll64.dll) copiée sous son nom 32-bit. gsdll32.dll.

    Ce code est un version VBA d'un code VB trouvé sur le net, il y a très longtemps, et adapté à mes besoins.

    A partir de là tu devrais pouvoir voir ce que le système fait vraiment.

    En voici le principal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    'GhostScript API
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal dest As Long, ByVal source As Long, ByVal bytes As Long)
    
    Private Declare Function gsapi_revision Lib "gsdll32.dll" (ByVal pGSRevisionInfo As Long, ByVal intLen As Long) As Long
    Private Declare Function gsapi_new_instance Lib "gsdll32.dll" (ByRef lngGSInstance As Long, ByVal lngCallerHandle As Long) As Long
    Private Declare Function gsapi_set_stdio Lib "gsdll32.dll" (ByVal lngGSInstance As Long, ByVal gsdll_stdin As Long, ByVal gsdll_stdout As Long, ByVal gsdll_stderr As Long) As Long
    Private Declare Sub gsapi_delete_instance Lib "gsdll32.dll" (ByVal lngGSInstance As Long)
    Private Declare Function gsapi_init_with_args Lib "gsdll32.dll" (ByVal lngGSInstance As Long, ByVal lngArgumentCount As Long, ByVal lngArguments As Long) As Long
    Private Declare Function gsapi_run_file Lib "gsdll32.dll" (ByVal lngGSInstance As Long, ByVal strFileName As String, ByVal intErrors As Long, ByVal intExitCode As Long) As Long
    Private Declare Function gsapi_exit Lib "gsdll32.dll" (ByVal lngGSInstance As Long) As Long
    
    Public Function CallGS(ByRef astrGSArgs() As String) As Boolean
        Dim intReturn As Long
        Dim intGSInstanceHandle As Long
        Dim aAnsiArgs() As String
        Dim aPtrArgs() As Long
        Dim intCounter As Long
        Dim intElementCount As Long
        Dim iTemp As Long
        Dim callerHandle As Long
        Dim ptrArgs As Long
    
        ' Load Ghostscript and get the instance handle
        intReturn = gsapi_new_instance(intGSInstanceHandle, callerHandle)
        If (intReturn < 0) Then
            CallGS = False
            Return
        End If
    
        ' Capture stdio
        intReturn = gsapi_set_stdio(intGSInstanceHandle, AddressOf gsdll_stdin, AddressOf gsdll_stdout, AddressOf gsdll_stderr)
    
        If (intReturn >= 0) Then
            ' Convert the Unicode strings to null terminated ANSI byte arrays
            ' then get pointers to the byte arrays.
            intElementCount = UBound(astrGSArgs)
            ReDim aAnsiArgs(intElementCount)
            ReDim aPtrArgs(intElementCount)
           
            For intCounter = 0 To intElementCount
                aAnsiArgs(intCounter) = StrConv(astrGSArgs(intCounter), vbFromUnicode)
                aPtrArgs(intCounter) = StrPtr(aAnsiArgs(intCounter))
            Next
            ptrArgs = VarPtr(aPtrArgs(0))
          
            intReturn = gsapi_init_with_args(intGSInstanceHandle, intElementCount + 1, ptrArgs)
    
            ' Stop the Ghostscript interpreter
            gsapi_exit (intGSInstanceHandle)
        End If
    
        ' release the Ghostscript instance handle
        gsapi_delete_instance (intGSInstanceHandle)
    
        If (intReturn >= 0) Then
            CallGS = True
        Else
            CallGS = False
        End If
    
    End Function
    
    Private Function ConvertFile(Ps_file As Variant, Pdf_file As Variant) As Boolean
        Dim astrArgs(10) As String
        astrArgs(0) = "ps2pdf" 'The First Parameter is Ignored
        astrArgs(1) = "-dNOPAUSE"
        astrArgs(2) = "-dBATCH"
        astrArgs(3) = "-dSAFER"
        astrArgs(4) = "-r300"
        astrArgs(5) = "-sDEVICE=pdfwrite"
        astrArgs(6) = "-sOutputFile=" & Trim(Pdf_file)
        'astrArgs(6) = "-sOutputFile=c:\out.pdf"
        astrArgs(7) = "-c"
        astrArgs(8) = ".setpdfwrite"
        astrArgs(9) = "-f"
        astrArgs(10) = Trim(Ps_file)
        ConvertFile = CallGS(astrArgs)
    End Function
    Cela me rappelle un film, que les vieux comme moi ont du connaître.
    Un gamin y disait : "Si j'aurais su, j'aurais pas venu".

    Bien d'accord.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  6. #6
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 073
    Points
    28 073
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Si ça fonctionne, ça veut simplement dire que le serveur COM auquel tu fais appel est bien, lui, en 64 bits
    Ou que la dite-dll en 64bits est en réalité à la fois 32 et 64 bits. Ça peut être le cas de certaines mais c'est pas systématique.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par sevyc64 Voir le message
    Ou que la dite-dll en 64bits est en réalité à la fois 32 et 64 bits. Ça peut être le cas de certaines mais c'est pas systématique.
    Là, tu m'apprendrais quelque chose... si tu as un lien parlant de ça.
    Je ne vois pas comment LoadLibrary pourrait faire la distinction et les allocations nécessaires et encore moins comment GetProcAddress pourrait choisir entre deux fonctions du même nom ! Le point d'entrée, les redirections, etc

    Es-tu sûr de ne pas confondre justement avec un server COM ? Les appels RPC peuvent être faits indifféremment depuis une app. 32 ou 64 et c'est justement la façon d'utiliser un DLL 32 depuis une app. 64 : la charger dans un processus 32 bits server COM et dialoguer par interface.

  8. #8
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 073
    Points
    28 073
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Là, tu m'apprendrais quelque chose... si tu as un lien parlant de ça.
    Je ne vois pas comment LoadLibrary pourrait faire la distinction et les allocations nécessaires et encore moins comment GetProcAddress pourrait choisir entre deux fonctions du même nom ! Le point d'entrée, les redirections, etc

    Es-tu sûr de ne pas confondre justement avec un server COM ? Les appels RPC peuvent être faits indifféremment depuis une app. 32 ou 64 et c'est justement la façon d'utiliser un DLL 32 depuis une app. 64 : la charger dans un processus 32 bits server COM et dialoguer par interface.
    Je serais bien incapable de t'expliquer comme ça marche, mais ça doit pas être sioux à mettre en place car on ne le rencontre pas souvent.
    Perso, j'ai du le rencontrer 1 ou 2 fois. Dans un cas c'était une api (type api windows) qui donnait accès à un driver spécifique. Le driver existait en 2 versions, par contre, la dll contenant l'api incluait les 2 versions 32 et 64 bits. On pouvait l’appeler aussi bien avec du code 32 que 64 bits, et les appels étaient strictement identiques si ce n'est que les types de variables en 64 bits étaient tronqués à leur capacité en 32bits.

    Il existe un phénomène, certes différents, avec les binaires .Net, qui, eux aussi suivant le mode de compilation, peuvent inclure les 2 versions 32 et 64 bits. Mais là, le choix de l'appel s'effectue en fonction de l'os d’exécution et non pas du processus appelant.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    En langage interprété sans aucun doute, mais en compilé... (je connais pas de compilateur susceptible de faire ce genre de chose)
    Peu importe, si une fois tu retombes sur ce truc, fais-moi signe

    ps: on va pas polluer la discussion de Godzestla

  10. #10
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Rebonjour,
    je pensais le problème résolu, mais sous WIN8-64 bits, le code ne fonctionne pas.

    J'obtiens une erreur No 5. su RegOpenKeyEx

    Voici les détails :

    Erreur :
    Error while calling RegOpenKeyEx : Return code 5, RegSam: 256, for key: HKEY_LOCAL_MACHINE, subkey:SOFTWARE\GPL Ghostscript
    D'après Windows.h, l'erreur 5 serait un problème d'autorité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     #define ERROR_ACCESS_DENIED                                5
    Il y avait une erreur dans le code que j'ai corrigée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal regSam As Long, phkResult As Long) As Long
    en lieu et place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Double, ByVal regSam As Long, phkResult As Long) As Long
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Tu as bien sûr ouvert la clé en lecture seule : KEY_READ ou KEY_QUERY_VALUE.

  12. #12
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,

    évidement que non, ne sachant même pas qu'il fallait y prendre garde. !!!

    Donc, est-ce que je procède juste si pour WIN8-64bit je mets le parametre samDesired comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\GPL Ghostscript", 0, KEY_WOW64_64KEY + KEY_READ, hKey)
    Je finirai par y arriver
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Ça devrait suffire

    Mais ne focalise pas trop sur Windows 8 et le 64 bits. Si sous XP tu faisais un test en utilisateur standard, tu aurais le même accès refusé !
    Maintenant et par rapport à ton autre discussion : Es-tu sûr que Ghostscript 64 est le bon choix pour Office 32 ? (A contrôler)

  14. #14
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Super.

    je teste ce soir...

    Pour le niveau de droits des utilisateurs aussi sous XP, ils ont généralement des droits d'administrateur.

    Pour Ghostscript-64, ça semble fonctionner sans problème avec Office-2007 32 bit sur WIN8-64 bit alors je serais plutot enclin à ne surtout plus toucher...... vu l'usage limité à la génération de documents PDF à partir de documents office.
    Si l'OS est 32-bit, j'installe alors Ghostscript 32 bits.

    (NB : je sais qu'il y a des solutions PDF native dans office maintenant, mais comme le code doit tourner sur tout un tas d'environnements OS (Xp-Vista_8) et Office(2003-2007-2010), la solution adoptée semble être un choix raisonnable et fiable).

    --------------Edit
    Encore merci pour ton aide ultra précieuse et tes explications détaillées. De même pour Sevyc64.
    Ce forum Win8 est à recommander.

    Je clôture demain matin, si comme supposé, tout est rêglé.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  15. #15
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Juste pour générer un pdf, partir sur une imprimante virtuelle type PDF-Creator aurait été plus simple

  16. #16
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Peut-être, mais pas certain car je me sert de ce code partout, même dans des logiciels tiers pour générer de manière automatique (sans aucune intervention) les fichiers PDF mixant du portrait et du paysage, que je stocke où et sous le nom que je veux pour chaque.

    Mais on pourrait en débattre des jours entiers.

    Le fond du problème remonte au jour où j'ai constaté, avec effroi que mon logiciel de PDF gratuit pouvait être automatisé mais ne produisait que du Postscript dans ce cas..... Le reste à suivi..... laborieusement.

    J'ai prévu de réécrire le tout en C++, mais dieu seul sait quand j'en aurai le temps.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  17. #17
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Voilà, c'est résolu avec encore qq petits aménagements.

    Pour info, le code ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Function Retrieve_Ghostscript_DLL(gs_pkg As Variant) As Boolean
    Dim hKey As Long, Cnt As Long, sName As String, sData As String, ret As Long, RetData As Long
    Const BUFFER_SIZE As Long = 255
    Const ERROR_NO_MORE_ITEMS = 259&
    Const HKEY_CURRENT_CONFIG = &H80000005
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const KEY_WOW64_64KEY = &H100
    Const KEY_WOW64_32KEY = &H200
    Const KEY_READ = &H20019
    Const KEY_QUERY = &H1
    Const REG_SZ = 1
    Const REG_DWORD = 4
    Dim Handle_Bits As String
    
    
    
    Dim vsValueName As String
    Dim eValueType As Long
    Dim nBuffer As Long
    Dim sBuffer As String
    Dim nLength As Long
    
    
    Dim Wow As Long
    
    Dim Release As String
    Dim Ghoscript_Key As String
    Dim objWSH As Object
    Dim Msg As String
    
    
    Handle_Bits = "32"
    'retrieve OS Characteristics
    Os_fullname = RetrieveWindows(Os_name, Os_bit)
    
    If Handle_Bits = "64" Then
         Wow = KEY_WOW64_64KEY
      Else
        Wow = KEY_WOW64_32KEY
    End If
    
    
    
    ret = BUFFER_SIZE
    
    'Open the registry key
    
    If RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\GPL Ghostscript", 0, Wow + KEY_READ, hKey) = 0 Then
        'Create a buffer
        sName = Space(BUFFER_SIZE)
        'Enumerate the keys
        While RegEnumKeyEx(hKey, Cnt, sName, ret, ByVal 0&, vbNullString, ByVal 0&, ByVal 0&) <> ERROR_NO_MORE_ITEMS
        'Show the enumerated key
            Ghoscript_Key = "SOFTWARE\GPL Ghostscript\" & Left$(sName, ret) & "\" & "GS_DLL"
            'Retrieve enumerated Key value
            gs_pkg = RegKeyValue(HKEY_LOCAL_MACHINE, "SOFTWARE\GPL Ghostscript\" & Left$(sName, ret) & "\", "GS_DLL", Handle_Bits)
            'prepare for the next key
            Cnt = Cnt + 1
            sName = Space(BUFFER_SIZE)
            ret = BUFFER_SIZE
        Wend
        'close the registry key
        RegCloseKey hKey
      Else
        Msg = "Error while calling RegOpenKeyEx : Return code " & RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\GPL Ghostscript", 0, Wow, hKey) & ", RegSam:" & Str(Wow) & ", for key: HKEY_LOCAL_MACHINE" & ", subkey:SOFTWARE\GPL Ghostscript"
        Retrieve_Ghostscript_DLL = False
        MsgBox Msg, vbCritical
        Debug.Print Msg
    End If
    
    
    Retrieve_Ghostscript_DLL = True
    
    
    e_gs_dll:
    End Function
    Autre module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
    Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByRef lpData As Any, ByRef lpcbData As Long) As Long
    
    Private Const KEY_QUERY_VALUE As Long = &H1
    Private Const STANDARD_RIGHTS_READ = &H20000
    Private Const KEY_ENUMERATE_SUB_KEYS = &H8&
    Private Const KEY_NOTIFY = &H10&
    Private Const SYNCHRONIZE = &H100000
    Private Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
    
    Private Const HKEY_CURRENT_USER = &H80000001
    
    Private Const REG_SZ = 1
    Private Const REG_DWORD = 4
    
    Function RegKeyValue(ByVal veRootKey As Long, ByRef vsKeyName As String, ByRef vsValueName As String, ByVal Handle_Bits As String) As Variant
    '*************************************************************************************************
    '*Usage = Regkeyvalue (&H80000002, "SOFTWARE\GPL Ghostscript\9.06\", "GS_DLL", "32")             *
    '*************************************************************************************************
    Dim hKey As Long
    Dim sBuffer As String
    Dim nBuffer As Long
    Dim nLength As Long
    Dim eValueType As Long
    Dim Wow As Long
    
    Const KEY_WOW64_64KEY = &H100
    Const KEY_WOW64_32KEY = &H200
    Const KEY_READ = &H20019
    
    If Handle_Bits = "64" Then
        Wow = KEY_WOW64_64KEY
      Else
        Wow = KEY_WOW64_32KEY
    End If
    
       If 0 = RegOpenKeyEx(veRootKey, vsKeyName, 0&, Wow + KEY_READ, hKey) Then
           RegQueryValueEx hKey, vsValueName, 0, eValueType, ByVal 0&, nLength
               
           Select Case eValueType
               Case REG_SZ
                   sBuffer = Space$(nLength)
                   RegQueryValueEx hKey, vsValueName, 0, eValueType, ByVal sBuffer, nLength
                   RegKeyValue = Left$(sBuffer, nLength - 1)
               Case REG_DWORD
                   RegQueryValueEx hKey, vsValueName, 0, eValueType, nBuffer, 4
                   RegKeyValue = nBuffer
           End Select
           RegCloseKey hKey
       End If
    End Function
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/10/2006, 17h05
  2. []Erreur d'accès à la Base de registres
    Par oulai_evado dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/12/2005, 13h59
  3. Accès à la base de registre windows à distance
    Par xavame dans le forum Sécurité
    Réponses: 4
    Dernier message: 13/07/2005, 15h23
  4. Comment empêcher l'accès à la base de registre ?
    Par AT dans le forum API, COM et SDKs
    Réponses: 11
    Dernier message: 29/03/2005, 09h44
  5. [MFC] Accès à la base de registre
    Par Nybbas dans le forum MFC
    Réponses: 3
    Dernier message: 25/07/2003, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo