我使用此过程将密钥枚举到Delphi 7中的TNTListView(UNICODE)中
procedure TForm1.TntButton1Click(Sender: TObject);
var
k : HKEY;
Buffer : array of widechar;
i : Integer;
iRes : Integer;
BuffSize : DWORD;
item : TTNTListItem;
WS : WideString;
begin
if RegOpenKeyExW (HKEY_CURRENT_USER, 'Software', 0, KEY_READ, K) = ERROR_SUCCESS then begin
try
i := 0;
BuffSize := 1;
while true do begin
SetLength (Buffer, BuffSize);
iRes := RegEnumKeyW(k, I, @Buffer[0], BuffSize);
if iRes = 259 then break;
if iRes = 234 then begin
inc (BuffSize);
continue;
end;
messageboxw (0, @Buffer[0], '', 0);
item := TNTListView1.Items.Add;
item.Caption := WideString (Buffer); // BREAKS IT
{ SOLUTION }
SetLength (WS, BuffSize - 1);
CopyMemory (@WS[1], @Buffer[0], (BuffSize * 2));
{ .... }
inc (i);
BuffSize := 1;
end;
finally
RegCloseKey (k);
SetLength (Buffer, 0);
end;
end;
end;
我看到大多数listviewitems都被修剪了!但是,如果在消息框中显示Buffer,则会以正确的长度显示完整的字符串。这是列表视图的错误,还是我缺少NULL CHAR(甚至2)之类的东西?
感谢帮助。
编辑:我只是注意到,当我将它转换为宽字符串时,缓冲区的大小被修剪成一半。
EDIT2:在列表视图中没有错误。 WideString Cast会以某种方式破坏字符串和/或未检测到NULL CHAR。
最佳答案
您是对的-将array of WideChar
转换为WideString
可以将Unicode德尔福之前的字符串长度减半。
在Delphi 2007上测试:
var
A: array of WideChar;
begin
SetLength(A, 4);
ShowMessage(IntToStr(Length(WideString(A)))); // 2
end;
在调试器CPU窗口中快速查看以上代码,可以发现类型转换
array of WideChar
-> WideString
不会导致任何数据转换; internal WideString format将字符串大小(即字节数)存储在与Delphi字符串或dynarrays存储长度相同的位置。结果,类型转换将字符串长度减半。关于delphi-7 - Typecasting WideString打破了widthchar的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12595822/