clé registre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

clé registre

Message par graph100 »

Je pose la question maintenant car je n'ai pas le temps de chercher tout de suite ;s

j'ai besoin d'inscrire une clé dans le registre, pour déclarer un type de fichier, j'utilise la fonction de la droopy lib :

Code : Tout sélectionner

;{ registre

; ecrire une chaine dans le registre

;###########
; CODE de la DROOPY LIB
;###########

Structure OneByte 
  a.b 
EndStructure 

; Convertit une chaine de caractères héxadécimale en valeur décimale stockée dans un entier long 
ProcedureDLL Hex2Dec(HexNumber.s) 
  *buf = AllocateMemory(StringByteLength(hexnumber, #PB_UTF8)+1);we need to make the string utf8 for when compiled as unicode
  ;edit 10/12/2008 changed the above line to account for the null written by the pokes below
  PokeS(*buf, HexNumber, -1, #PB_UTF8)
  *t.OneByte = *buf;@HexNumber 
  Result.l = 0 
  While *t\a <> 0 
    If *t\a >= '0' And *t\a <= '9' 
      Result = (Result << 4) + (*t\a - 48) 
    ElseIf *t\a >= 'A' And *t\a <= 'F' 
      Result = (Result << 4) + (*t\a - 55) 
    ElseIf *t\a >= 'a' And *t\a <= 'f' 
      Result = (Result << 4) + (*t\a - 87) 
    Else 
      Result = (Result << 4) + (*t\a - 55) 
    EndIf 
    *t + 1 
  Wend 
  FreeMemory(*buf)
  ProcedureReturn Result 
EndProcedure 


Procedure RegConvertRegKeyToTopKey(Key.s)
  
  topKey.s=StringField(Key,1,"\")
  topKey=UCase(topKey)
  
  Select topKey
    
    Case "HKEY_CLASSES_ROOT"
      retour=#HKEY_CLASSES_ROOT
      
    Case "HKEY_CURRENT_USER"
      retour=#HKEY_CURRENT_USER
      
    Case "HKEY_LOCAL_MACHINE"
      retour=#HKEY_LOCAL_MACHINE
      
    Case "HKEY_USERS"
      retour=#HKEY_USERS 
      
    Case "HKEY_CURRENT_CONFIG"
      retour=#HKEY_CURRENT_CONFIG 
      
  EndSelect
  
  ProcedureReturn retour
  
EndProcedure

Procedure.s RegConvertRegKeyToKeyName(Key.s)
  PositionSlash=FindString(Key,"\",1)
  retour.s=Right(Key,(Len(Key)-PositionSlash))
  ProcedureReturn retour
EndProcedure


ProcedureDLL RegSetValue(Key.s, ValueName.s, Value.s, Type, ComputerName.s) ;  OK
  
  ; Return 1 if success / 0 if fail
  
  topKey=RegConvertRegKeyToTopKey(Key)
  KeyName.s=RegConvertRegKeyToKeyName(Key)
  lpData.s 
  
  If Left(KeyName, 1) = "\" 
    KeyName = Right(KeyName, Len(KeyName) - 1) 
  EndIf 
  
  If ComputerName = "." 
    GetHandle = RegOpenKeyEx_(topKey, KeyName, 0, #KEY_ALL_ACCESS, @hKey) 
  Else 
    lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
    GetHandle = RegOpenKeyEx_(lhRemoteRegistry, KeyName, 0, #KEY_ALL_ACCESS, @hKey) 
  EndIf 
  
  If GetHandle = #ERROR_SUCCESS 
    lpcbData = 255 
    lpData = Space(255) 
    
    Select Type 
      
      Case #REG_EXPAND_SZ 
        GetHandle = RegSetValueEx_(hKey, ValueName, 0, #REG_EXPAND_SZ, @Value, StringByteLength(Value) + 1) 
        
      Case #REG_SZ 
        GetHandle = RegSetValueEx_(hKey, ValueName, 0, #REG_SZ, @Value, StringByteLength(Value) + 1) 
        
      Case #REG_DWORD 
        lValue = Val(Value) 
        GetHandle = RegSetValueEx_(hKey, ValueName, 0, #REG_DWORD, @lValue, 4) 
        
      Case #REG_BINARY
        LenBuffer=Len(Value)/2
        *RegBuffer=AllocateMemory(LenBuffer)
        For n=0 To LenBuffer-1
          OctetHexa.s=Mid(Value,(n*2)+1,2)
          Octet=Hex2Dec(OctetHexa)
          PokeB(*RegBuffer+n,Octet)
        Next
        GetHandle= RegSetValueEx_(hKey,ValueName,0,#REG_BINARY,*RegBuffer,LenBuffer) 
        FreeMemory(*RegBuffer)
        
    EndSelect 
    
    RegCloseKey_(hKey) 
    ergebnis = 1 
    ProcedureReturn ergebnis 
  Else 
    RegCloseKey_(hKey) 
    ergebnis = 0 
    ProcedureReturn ergebnis 
  EndIf 
EndProcedure 

;###########

;}
de la manière suivante :

Code : Tout sélectionner

res = RegSetValue("HKEY_CLASSES_ROOT\.mgwa", "", "SCMangwa", #REG_SZ, ".")
Debug res
Mais, le code retourne 0, même en mode admin, si la clé n'existe pas déjà, ce qui n'est pas pratique pour une installation.
Donc ça ne fonctionne pas.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: clé registre

Message par Ar-S »

Est-ce Normal que tu n'ai pas mis de ValueName ? (le SZ Value dans l'exemple)

Code : Tout sélectionner

RegCreateKeyValue("HKEY_LOCAL_MACHINE\SOFTWARE\Test\SubKeyAuto","SZ Value","SZ",#REG_SZ,".")
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: clé registre

Message par Droopy »

RegSetValue créé des valeurs mais pas les clés
Utilise RegCreateKeyValue pour créer la clé, et y ajouter une valeur

Code : Tout sélectionner

res = RegCreateKeyValue("HKEY_CLASSES_ROOT\.mgwa", "", "SCMangwa", #REG_SZ, ".")
Debug res
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: clé registre

Message par graph100 »

Ok, ça fonctionne.

Cependant, je suis obligé de demander le mode administrateur pour créer les clés. Il me semble qu'il y a plein d'installateur qui n'ont pas besoin du mode administrateur pour ajouter des clés dans le registre.
Avez vous une idée ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: clé registre

Message par graph100 »

J'ai eu un problème un moment, la clé n'étant entrée qu'à moitié, puis je me suis aperçu que le mode unicode étais activé.
Il me semble que c'est marqué au début de ta librairie que ce n'est pas compatible avec l’Unicode.
Je ne me souviens plus pourquoi je l'ai activé, donc j'espère que ça ne poseras pas de problème de le virer ^^
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre