注意:我使用的是 Delphi XE2

我正在尝试添加一个注册表项。这是我当前的代码:

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.

这导致以下情况:

它只添加前四个字符

但是当我将“值”参数更改为:
123456789123456789

然后它补充说:
123456789

因此,由于某种原因,它似乎只增加了给定值的一半。我该如何解决这个问题?

我是否为 RegSetValueEx 中的 *lpData 参数传递了错误的数据类型?

最佳答案

Read the documentationRegSetValueEx() 的最后一个参数是字节数,但您传递给它的是字符数(甚至不是正确的数 - 您必须包含空终止符)。 SizeOf(WideChar) 是 2,所以你告诉 RegSetValueEx() 只写字符串数据的一半。你需要解决这个问题,例如:

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;

话虽如此,您可以考虑使用 TRegistry 类,它为您处理这些细节:
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;

关于delphi - 为什么 RegSetValueEx 只添加半个字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13280536/

10-10 21:33