Page 1 sur 1

clé registre

Publié : jeu. 07/juil./2011 14:50
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.

Re: clé registre

Publié : jeu. 07/juil./2011 20:19
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,".")

Re: clé registre

Publié : jeu. 07/juil./2011 20:53
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

Re: clé registre

Publié : jeu. 07/juil./2011 22:29
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 ?

Re: clé registre

Publié : jeu. 07/juil./2011 23:40
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 ^^