3 votes

Pourquoi RegSetValueEx n'ajoute-t-il que la moitié d'une chaîne ?

Note : J'utilise Delphi XE2.

J'essaie d'ajouter une clé de registre. Voici mon code actuel :

function AddRegKey(Key:HKEY;Keyname,Value:String):Boolean;
var
  phkResult:HKEY;
begin
  if RegOpenKeyEx(Key, PWideChar('SOFTWARE\Microsoft\Windows\CurrentVersion\Run'), 0, KEY_SET_VALUE, phkResult) = ERROR_SUCCESS then
    begin
      Result := (RegSetValueEx(phkResult, PWideChar(KeyName), 0, REG_SZ, PWideChar(Value), Length(Value)) = ERROR_SUCCESS);
      RegCloseKey(phkResult);
    end
  else Result:=False;
end;

begin
    If AddRegKey(HKEY_CURRENT_USER,'TestTest','123456789') Then
        MessageBox(0,'Success','Test',0);
end.

Ce qui donne les résultats suivants :

enter image description here

Il ajoute seulement les quatre premiers caractères

Mais lorsque je change le paramètre "Valeur" en :

123456789123456789

Elle ajoute ensuite :

123456789

Il semble donc que, pour une raison quelconque, il n'ajoute que la moitié de la valeur donnée. Comment dois-je m'y prendre pour résoudre ce problème ?

Est-ce que je passe le mauvais type de données pour le paramètre *lpData dans RegSetValueEx ?

10voto

Remy Lebeau Points 130112

Lisez la documentation . Le dernier paramètre de RegSetValueEx() est un compte d'octets, mais vous lui transmettez un compte de caractères à la place (et même pas le bon compte, d'ailleurs - vous devez inclure le terminateur nul). SizeOf(WideChar) est 2, donc vous dites RegSetValueEx() pour n'écrire que la moitié des données de la chaîne. Vous devez corriger cela, par exemple :

function AddRegKey(Key:HKEY; Keyname, Value: String): Boolean;
var
  phkResult: HKEY;
begin
  Result := False;
  if RegOpenKeyEx(Key, PChar('SOFTWARE\Microsoft\Windows\CurrentVersion\Run'), 0, KEY_SET_VALUE, phkResult) = ERROR_SUCCESS then
  begin
    Result := RegSetValueEx(phkResult, PChar(KeyName), 0, REG_SZ, PChar(Value), (Length(Value) + 1) * SizeOf(Char)) = ERROR_SUCCESS;
    RegCloseKey(phkResult);
  end;
end;

Cela dit, vous pourriez envisager d'utiliser le TRegistry qui gère ces détails pour vous :

uses
  ..., Registry;

function AddRegKey(Key: HKEY; Keyname, Value: String): Boolean;
var
  Reg: TRegistry;
begin
  Result := False;
  try
    Reg := TRegistry.Create(KEY_SET_VALUE);
    try
      Reg.RootKey := Key;
      if Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run', True) then
      try
        Reg.WriteString(KeyName, Value);
        Result := True;
      finally
        Reg.CloseKey;
      end;
    finally
      Reg.Free;
    end;
  except
  end;
end;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X