gpt4 book ai didi

delphi-7 - 类型转换 WideString 会破坏宽字符数组

转载 作者:行者123 更新时间:2023-12-03 18:28:09 26 4
gpt4 key购买 nike

我使用此过程将 key 枚举到 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;

我看到大多数 ListView 项都被修剪了!但是,如果我在消息框中显示缓冲区,它会以正确的长度显示完整的字符串。这是 ListView 的错误还是我错过了 NULL CHAR(甚至 2)之类的东西?

感谢帮助。

编辑:我刚刚注意到,当我将 Buffer 转换为宽字符串时,它被修剪成一半。

EDIT2: ListView 中没有错误。 WideString Cast 以某种方式破坏了字符串和/或没有检测到 NULL CHAR(s)。

最佳答案

你是对的 - 选角 array of WideCharWideString在 Unicode 之前的 Delphi 中将字符串长度减半。

在 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 字符串或 dynarray 存储的同一位置 长度 .结果,类型转换将字符串长度减半。

关于delphi-7 - 类型转换 WideString 会破坏宽字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12595822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com