2012-11-08 18 views
3

注:我正在使用德爾福XE2爲什麼RegSetValueEx只添加一半字符串?

我想添加一個註冊表項。這裏是我當前的代碼:

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. 

這是導致如下:

enter image description here

它只是增加了前四個字符

但是,當我改變「值」參數到:

123456789123456789 

然後它增加:

123456789 

所以看起來好像它只是由於某種原因增加了給定值的一半。我該如何解決這個問題?

我是傳遞了錯誤的數據類型爲函數RegSetValueEx的*的lpData參數?

回答

10

Read the documentationRegSetValueEx()的最後一個參數是一個字節計數,但是您將它傳遞給一個字符數(而不是正確的計數 - 您必須包含空終止符)。 SizeOf(WideChar)是2,所以你告訴RegSetValueEx()只寫入一半的String數據。你需要解決這個問題,比如:

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; 
+0

感謝偉大的答案!我現在知道了。 :捂臉: –

相關問題