首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型转换宽字符的WideString断点数组

类型转换宽字符的WideString断点数组
EN

Stack Overflow用户
提问于 2012-09-26 14:33:42
回答 1查看 2.3K关注 0票数 2

在Delphi7中,我使用这个过程将密钥ENUM到一个TNTListView (UNICODE)中

代码语言:javascript
复制
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的一个Bug,还是我遗漏了一些东西,比如NULL CHAR (甚至是2)?

谢谢你的帮助。

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

EDIT2:列表视图中没有错误。WideString强制转换以某种方式中断了字符串,并且/或者没有检测到NULL字符。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-26 16:08:03

您正确地将array of WideChar转换为WideString,将Unicode之前的Delphi中的字符串长度减半。

在Delphi 2007上测试:

代码语言:javascript
复制
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存储length的相同位置。因此,类型转换将字符串长度减半。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12595822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档