3

注: 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.

その結果、次のようになります。

ここに画像の説明を入力

最初の4文字を追加するだけです

しかし、「値」パラメーターを次のように変更すると:

123456789123456789

次に、次のように追加します。

123456789

そのため、何らかの理由で指定された値の半分しか追加されていないように見えます。これを解決するにはどうすればよいですか?

RegSetValueEx の *lpData パラメータに間違ったデータ型を渡していますか?

4

1 に答える 1

10

ドキュメントを読んでください。の最後のパラメーターRegSetValueEx()はバイト数ですが、代わりに文字数を渡しています(正しい数でもありません-nullターミネーターを含める必要があります)。 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;
于 2012-11-08T00:23:41.583 に答える