delphi-7 - 类型转换 WideString 会破坏 Widechar 数组

标签 delphi-7 delphi

我使用此过程将键枚举到 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)之类的东西?

感谢您的帮助。

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

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

最佳答案

你是对的 - 将 WideChar 数组 转换为 WideString 可以将 Unicode 之前的 Delphi 中的字符串长度减半。

在 Delphi 2007 上测试:

var
  A: array of WideChar;

begin
  SetLength(A, 4);
  ShowMessage(IntToStr(Length(WideString(A)))); // 2
end;

在调试器 CPU 窗口中快速查看上述代码表明,类型转换 WideChar 数组-> WideString 不会导致任何数据转换; internal WideString format将字符串 size(即字节数)存储在 Delphi 字符串或动态数组存储 length 的同一位置。结果,类型转换将字符串长度减半。

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

相关文章:

multithreading - 线程向主 UI 线程发布消息被阻止/删除

multithreading - 从互联网下载文件,同时能够随时中止下载

delphi - 获取当前时间毫秒

delphi - 使用 TChromium 时 LoadURL 出错

delphi - 如何使用 Delphi 7 在状态/任务栏按钮中显示进度?

algorithm - Delphi 7 的 Shannon-Fano 算法示例?

delphi - Delphi 的 VCL 中的命名空间兼容性

delphi - 组织搜索路径

delphi - 处理DbExpress SQL错误代码245

Delphi - 恢复 DBGrid 中的实际行