Regread et les "\"

Messages postés
5
Date d'inscription
lundi 14 août 2006
Statut
Membre
Dernière intervention
16 août 2006
-
Messages postés
5
Date d'inscription
lundi 14 août 2006
Statut
Membre
Dernière intervention
16 août 2006
-
Bonjour,

En VBA pour Excel 2003 je rencontre un petit problème ...
je dois lire la clé
HKEY_CURRENT_USER\Software\Microsoft\Windows
NT\CurrentVersion\Devices\ avec = \\Srv\Printer 1 .
( imprimante réseau )

Il semble qu'il y ait un problème avec la lecture des "" car si je remplace
le nom par Printer (sans mettre quoi que ce soit comme "") ca fonctionne .

Je crois avoir lu quelquepart ( mais ca date ) qu'il y aurait un problème avec les "" ..

Quelqu'un peut m'aider ?

Grand merci !

7 réponses

Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
Quel méthode utilise tu pour écrire ?
Je te conseil les APIs. En principe ca dervai pas poser de problemes.

Kenji



Il était une fois, un pauvre petit règlement que personne ne lisait. Il est tout sympa mais il est triste, aidez-le, lisez-le, ca lui ferait plaisir ainsi qu'a n
Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Statut
Membre
Dernière intervention
17 février 2007

Salut, pour une imprimante réseau ça ne serait pas plutôt //Srv/Printer 1 qu'il faut écrire ?
Messages postés
5
Date d'inscription
lundi 14 août 2006
Statut
Membre
Dernière intervention
16 août 2006

Salut,


 


Je suis dans un module VBA d'Excel et j'utilise le code suivant


Mais je ne sais pas comment je peux voir si j'utilise les API's ... si tu peux m'éclairer

Dim W_Cle As String 'Chemin de ma clef dans le registre
Dim W_WscripShell As Object
Dim W_printer As String
W_Cle = "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices" & "[file://\\SrvAub27\Archivage \\SrvAub27\Archivage]"
Set W_WscripShell = CreateObject("WScript.Shell")


W_printers = W_WscripShell.RegRead(W_Cle)

ce qui me renvoie le message d'erreur ...
"Racine incorrecte dans la clé registre "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices\[file://SrvAub27/Archivage \\SrvAub27\Archivage]"

...
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
Par APIs, ca donne.



Private

Declare

Function
RegOpenKey
Lib

"advapi32.dll"

Alias

"RegOpenKeyA"
(
ByVal
hKey
As

Long
,
ByVal
lpSubKey
As

String
,
ByVal
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
,
ByVal
lpType
As

Long
,
ByVal
lpData
As

String
,
ByVal
lpcbData
As

Long
)
As

Long

Private

Declare

Function
RegCloseKey
Lib

"advapi32.dll"
(
ByVal
hKey
As

Long
)
As

Long

Private

Declare

Function
RegCreateKey
Lib

"advapi32.dll"

Alias

"RegCreateKeyA"
(
ByVal
hKey
As

Long
,
ByVal
lpSubKey
As

String
,
ByVal
phkResult
As

Long
)
As

Long

Private

Declare

Function
RegSetValueExString
Lib

"advapi32.dll"

Alias

"RegSetValueExA"
(
ByVal
hKey
As

Long
,
ByVal
lpValueName
As

String
,
ByVal
Reserved
As

Long
,
ByVal
dwType
As

Long
,
ByVal
lpValue
As

String
,
ByVal
cbData
As

Long
)
As

Long

Private

Declare

Function
RegSetValueExLong
Lib

"advapi32.dll"

Alias

"RegSetValueExA"
(
ByVal
hKey
As

Long
,
ByVal
lpValueName
As

String
,
ByVal
Reserved
As

Long
,
ByVal
dwType
As

Long
,
ByVal
lpValue
As

Long
,
ByVal
cbData
As

Long
)
As

Long

Private

Declare

Function
RegFlushKey
Lib

"advapi32.dll"
(
ByVal
hKey
As

Long
)
As

Long

'// Registry section definitions

Public

Enum
eHKey

  HKEY_CLASSES_ROOT = &H80000000

  HKEY_CURRENT_USER = &H80000001

  HKEY_LOCAL_MACHINE = &H80000002

  HKEY_USERS = &H80000003

  HKEY_PERFORMANCE_DATA = &H80000004

  HKEY_CURRENT_CONFIG = &H80000005

  HKEY_DYN_DATA = &H80000006

End

Enum

'// Registry value type definitions

Public

Enum
eRegMode

  REG_NONE = 0
'// No value type

  REG_SZ = 1
'// Unicode nul terminated string

  REG_EXPAND_SZ = 2
'// Unicode nul terminated string

  REG_BINARY = 3
'// Free form binary

  REG_DWORD = 4
'// 32-bit number

  REG_DWORD_LITTLE_ENDIAN = 4
'// 32-bit number (same as REG_DWORD)

  REG_DWORD_BIG_ENDIAN = 5
'// 32-bit number

  REG_LINK = 6
'// Symbolic Link (unicode)

  REG_MULTI_SZ = 7
'// Multiple Unicode strings

  REG_RESOURCE_LIST = 8
'// Resource list in the resource map

  REG_FULL_RESOURCE_DESCRIPTOR = 9
'// Resource list in the hardware description

  REG_RESOURCE_REQUIREMENTS_LIST = 10

End

Enum

'// Fonction pour sauver une donné dans le registre

Public

Function
WriteRegistry(
ByVal
hKey
As
eHKey,
ByVal
Section
As

String
,
ByVal
Key
As

String
,
ByVal
RegMode
As
eRegMode,
ByVal
Value
As

Object
)

  
Dim
KeyValue
As

Long

  
Call
RegCreateKey(hKey, Section, KeyValue)
'// Ouverture

  
If
RegMode = REG_DWORD
Then

'// Si c'est une valeur DWORD

    
Call
RegSetValueExLong(KeyValue, Key, 0&, RegMode,
CLng
(Value), 4)
'// On écrit une valeur de type long

  
Else

    
If
RegMode = REG_SZ
Then
Value = Value + Chr(0)
'// Si c une SZ, on ajoute un 0

    
Call
RegSetValueExString(KeyValue, Key, 0&, RegMode, Value, Len(Value))
'// On écrit une valeur de type texte

  
End

If

  
Call
RegFlushKey(KeyValue)

  
Call
RegCloseKey(KeyValue)

End

Function

'// Fonction pour lire une donnée du registre

Public

Function
ReadRegistry(
ByVal
hKey
As
eHKey,
ByVal
Section
As

String
,
ByVal
Key
As

String
)
As

String

  
Dim
KeyValue
As

Long

  
Dim
RegMode
As
eRegMode

  
On

Error

Resume

Next

  
Call
RegOpenKey(hKey, Section, KeyValue)
'// Ouverture

  ReadRegistry = Space$(2048)

  
Call
RegQueryValueEx(KeyValue, Key, 0&, RegMode, ReadRegistry, Len(ReadRegistry))

  
If
Err.Number = 0
Then

    
If
RegMode = REG_DWORD
Then

'// Si c'est une valeur DWORD

      ReadRegistry = Format$(Asc(Mid$(ReadRegistry, 1, 1)) + &H100& * Asc(Mid$(ReadRegistry, 2, 1)) + &H10000 * Asc(Mid$(ReadRegistry, 3, 1)) + &H1000000 *
CDbl
(Asc(Mid$(ReadRegistry, 4, 1))),
"000"
)
'// On converti le format en décimal

    
ElseIf
RegMode = REG_BINARY
Then

'// Si cest une valeur BINARY

      ReadRegistry = Left$(ReadRegistry, Len(ReadRegistry))
'// On lit la valeur

    
Else

'// Sinon

      ReadRegistry = Left$(ReadRegistry, InStr(ReadRegistry, Chr(0)) - 1)
'// lit avant le 0

    
End

If

  
End

If

  
Call
RegCloseKey(KeyValue)
'// Fermeture

End

Function




Et pour l'utilisation:



Call
WriteRegistry(HKEY_CURRENT_USER,
"Software\Microsoft\Windows NT\CurrentVersion\Devices"
,
"\\SrvAub27\Archivage"
, REG_SZ,
"winspool,Ne02:"
)





Kenji



Il était une fois, un pauvre petit règlement que personne ne lisait. Il est tout sympa mais il est triste, aidez-le, lisez-le, ca lui ferait plaisir ainsi qu'a n
Messages postés
5
Date d'inscription
lundi 14 août 2006
Statut
Membre
Dernière intervention
16 août 2006

Merci beaucoup, ce ne me renvoie plus de message d'erreur
mais quand je fais
 <Variable> = ReadRegistry(HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", "[file://\\srvaub27\Archivage \\srvaub27\Archivage]")

la chaîne renvoyée est vide ....( même avec un Trim() ) .... j'ai oublié qqch ????
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
Ha désolé, c'est à la coloration syntaxique qu'il m'a mis des ByVal la ou y'en avait pas.
Voila tout les déclarations d'api à remplacer.



Private

Declare

Function
RegOpenKey
Lib

"advapi32.dll"

Alias

"RegOpenKeyA"
(
ByVal
hKey
As

Long
,
ByVal
lpSubKey
As

String
,
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
,
ByVal
lpData
As

String
,
ByRef
lpcbData
As

Long
)
As

Long

Private

Declare

Function
RegCloseKey
Lib

"advapi32.dll"
(
ByVal
hKey
As

Long
)
As

Long

Private

Declare

Function
RegCreateKey
Lib

"advapi32.dll"

Alias

"RegCreateKeyA"
(
ByVal
hKey
As

Long
,
ByVal
lpSubKey
As

String
,
ByRef
phkResult
As

Long
)
As

Long

Private

Declare

Function
RegSetValueExString
Lib

"advapi32.dll"

Alias

"RegSetValueExA"
(
ByVal
hKey
As

Long
,
ByVal
lpValueName
As

String
,
ByVal
Reserved
As

Long
,
ByVal
dwType
As

Long
,
ByVal
lpValue
As

String
,
ByVal
cbData
As

Long
)
As

Long

Private

Declare

Function
RegSetValueExLong
Lib

"advapi32.dll"

Alias

"RegSetValueExA"
(
ByVal
hKey
As

Long
,
ByVal
lpValueName
As

String
,
ByVal
Reserved
As

Long
,
ByVal
dwType
As

Long
,
ByRef
lpValue
As

Long
,
ByVal
cbData
As

Long
)
As

Long

Private

Declare

Function
RegFlushKey
Lib

"advapi32.dll"
(
ByVal
hKey
As

Long
)
As

Long




Et en principe ca marche



Kenji



Il était une fois, un pauvre petit règlement que personne ne lisait. Il est tout sympa mais il est triste, aidez-le, lisez-le, ca lui ferait plaisir ainsi qu'a n
Messages postés
5
Date d'inscription
lundi 14 août 2006
Statut
Membre
Dernière intervention
16 août 2006

Ca marche super bien,

Un énoooooorme merci !!!

J'ai fait mes tests en mettant le tout dans le module concerné, mais généralement, je préfère mettre ce genre de code ailleur que dans le fichier concerné ( les fonctions, je les met dans un .xla ), histoire de pouvoir le récupérer facilement par la suite ....
Alors, si tu as un conseil sur une autre façon de faire, je suis preneuse  .

Merci!