J'utilise ce code pour lire les données binaires du registre à une chaîneLire REG_BINARY à cordes
function ReadBinary (RootKey: HKEY; SubKey,ValueName: WideString; var Data : String): Bool;
var
Key : HKey;
Buffer : array of char;
Size : Cardinal;
RegType : DWORD;
begin
result := FALSE;
RegType := REG_BINARY;
if RegOpenKeyExW(RootKey, pwidechar(SubKey), 0, KEY_READ, Key) = ERROR_SUCCESS then begin
if RegQueryValueExW(Key,pwidechar(ValueName),NIL,@RegType, NIL,@Size) = ERROR_SUCCESS then begin
SetLength (Buffer, Size + 1);
FillChar(Buffer, SizeOf (Buffer), #0);
if RegQueryValueExW(Key,pwidechar(ValueName),NIL,@RegType, @Buffer[0],@Size) = ERROR_SUCCESS then begin
result := TRUE;
Data := String (Buffer); // Shows empty or sometimes 1 random char.
end;
end;
end;
RegCloseKey (Key);
end;
EDIT2:
Il fonctionne très bien avec un tableau déclaré fixe de l'octet/char
function ReadBinary (RootKey: HKEY; SubKey,ValueName: WideString; var Data : String): Bool;
var
Key : HKey;
Buffer : array [0..200] of char;
Size : Cardinal;
RegType : DWORD;
begin
result := FALSE;
RegType := REG_BINARY;
if RegOpenKeyExW(RootKey, pwidechar(SubKey), 0, KEY_READ, Key) = ERROR_SUCCESS then begin
if RegQueryValueExW(Key,pwidechar(ValueName),NIL,@RegType, NIL,@Size) = ERROR_SUCCESS then begin
FillChar(Buffer, SizeOf (Buffer), #0);
if RegQueryValueExW(Key,pwidechar(ValueName),NIL,@RegType, @Buffer,@Size) = ERROR_SUCCESS then begin
result := TRUE;
Data := String (Buffer);
end;
end;
end;
RegCloseKey (Key);
end;
Je suis coincé. Qu'est-ce que je fais de mal et quelle est la solution?
Nous vous remercions de votre aide.
EDIT:
Je suis conscient que je suis en train de lire des données binaires à partir du Registre. Il peut donc déjà être terminé et peut renvoyer des résultats erronés. Je peux garantir qu'il n'y a pas de caractères # 0 dans les données binaires parce que j'ai écrit un texte long (Chaîne avec CR/LF) dans la valeur avant.
Si vous définissez un point d'arrêt de débogage sur l'affectation 'Data: = String (Buffer)' et examinez Buffer', que contient-il réellement? –
semble que je ne peux même pas y accéder. Mais je pense que c'est # 0. Je reçois beaucoup de violations d'accès si j'essaie quelque chose comme ceci: si buffer [0] = '' then messagebox (0, 'ERROR', '', 0); –
EDIT: Je reçois 000000 messagebox (0, pchar (Format ('% 8p', [@buffer [0]])), '', 0); –