Merci pour vos réponses mais j'ai beau retourner le problème dans tous les sens, à chaque fois que je passe un paramètre à ma fonction en concaténant deux chaines, le retour est erroné.
Pour info voilà ce que j'essayais de faire:
Code : Tout sélectionner
Procedure Local_ExtractRootKey(KeyPath.s)
Select UCase(Left(KeyPath, FindString(KeyPath, "\", 1) - 1))
Case "HKEY_CLASSES_ROOT", "HKCR"
ProcedureReturn #HKEY_CLASSES_ROOT
Case "HKEY_CURRENT_USER", "HKCU"
ProcedureReturn #HKEY_CURRENT_USER
Case "HKEY_LOCAL_MACHINE", "HKLM"
ProcedureReturn #HKEY_LOCAL_MACHINE
Case "HKEY_USERS", "HKU"
ProcedureReturn #HKEY_USERS
Case "HKEY_CURRENT_CONFIG ", "HKCC"
ProcedureReturn #HKEY_CURRENT_CONFIG
Default
ProcedureReturn #NUL
EndSelect
EndProcedure
Procedure.s Local_ExtractSubKey(KeyPath.s)
Protected Separator
If Right(KeyPath, 1) = "\"
KeyPath = Left(KeyPath, Len(KeyPath) - 1)
EndIf
Separator = FindString(KeyPath, "\", 1)
If Separator
ProcedureReturn Mid(KeyPath, FindString(KeyPath, "\", 1) + 1)
Else
ProcedureReturn ""
EndIf
EndProcedure
ProcedureDLL.s Reg_GetValue(KeyPath.s, ValueName.s)
Protected KeyRoot, SubKey.s, hKey, Value.s, i, Type
Protected lpcbData, *lpData, *Buffer, ptr_lpData, ptr_Buffer
KeyRoot = Local_ExtractRootKey(KeyPath)
SubKey = Local_ExtractSubKey(KeyPath)
If KeyRoot And SubKey
If RegOpenKeyEx_(KeyRoot, @SubKey, #NUL, #KEY_READ, @hKey) = #ERROR_SUCCESS
RegQueryValueEx_(hKey, @ValueName, #NUL, @Type, *lpData, @lpcbData)
If lpcbData
*lpData = AllocateMemory(lpcbData)
If RegQueryValueEx_(hKey, @ValueName, #NUL, @Type, *lpData, @lpcbData) = #ERROR_SUCCESS
If ValueName
ValueName = ReplaceString(ValueName, "\", "\\")
ValueName = ReplaceString(ValueName, #DQUOTE$, "\" + #DQUOTE$)
EndIf
Select Type
Case #REG_SZ, #REG_EXPAND_SZ
Value = PeekS(*lpData)
Value = ReplaceString(Value, "\\", "\")
Value = ReplaceString(Value, "\" + Chr(34), Chr(34))
Case #REG_DWORD
Value = LCase(RSet(Hex(PeekL(*lpData), #PB_Integer), 8, "0"))
Case #REG_MULTI_SZ
*Buffer = AllocateMemory(lpcbData)
ptr_lpData = *lpData
ptr_Buffer = *Buffer
While ptr_lpData < *lpData + lpcbData - SizeOf(Character) * 2
Value = PeekS(ptr_lpData)
PokeS(ptr_Buffer, Value)
ptr_lpData = ptr_lpData + StringByteLength(Value) + SizeOf(Character)
ptr_Buffer = ptr_Buffer + StringByteLength(Value)
PokeS(ptr_Buffer, #LF$)
ptr_Buffer = ptr_Buffer + SizeOf(Character)
Wend
Value = PeekS(*Buffer)
FreeMemory(*Buffer)
Default
*Buffer = AllocateMemory((lpcbData + 1) * 3 * SizeOf(Character))
ptr_lpData = *lpData
For i = 0 To lpcbData - 1
PokeS(*Buffer + i * 3 * SizeOf(Character), LCase(RSet(Hex(PeekB(*lpData + i) & $FF), 2, "0")) + ",")
Next
PokeS((*Buffer + i * 3 * SizeOf(Character)) - SizeOf(Character), Chr(0))
Value = PeekS(*Buffer)
FreeMemory(*Buffer)
EndSelect
EndIf
FreeMemory(*lpData)
EndIf
EndIf
RegCloseKey_(hKey)
EndIf
ProcedureReturn Value
EndProcedure
En faisant
Code : Tout sélectionner
Key.s = "HKEY_CLASSES_ROOT\"
SubKey.s = ".exe"
ValueName.s = ""
Value.s = Reg_GetValue(Key + SubKey , ValueName)
Debug Value
En retour j'obtiens
HKEY_CLASSES_ROOT\.exeexefile
Par contre
Code : Tout sélectionner
Key.s = "HKEY_CLASSES_ROOT\.exe"
ValueName.s = ""
Value.s = Reg_GetValue(Key, ValueName)
Debug Value
En retour j'ai bien
exefile