You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi Sydney CE中ShFileOpStruct的pFrom参数赋值问题求助

解决Delphi Sydney中ShFileOpStruct.pFrom的赋值问题

问题根源

Delphi 7的String是ANSI编码,而Delphi Sydney默认String为UnicodeString。直接用+拼接#0时,UnicodeString会将第一个#0视为字符串结束符,导致后续内容被截断,最终转PWideChar只能获取到第一个#0前的内容。

可行解决方案

方案1:借助TStringList构建符合要求的缓冲区

TStringList的GetTextBuf方法可以直接生成以#0分隔、结尾追加双#0的宽字符缓冲区,完美匹配pFrom的要求:

procedure TForm13.Button1Click(Sender: TObject);
var
  SL: TStringList;
  sfo: TSHFileOpStruct;
  WideBuf: PWideChar;
begin
  SL := TStringList.Create;
  try
    SL.Add('123');
    SL.Add('456');
    // 先获取所需缓冲区大小,再分配内存生成内容
    WideBuf := SL.GetTextBuf(nil, 0);
    try
      ZeroMemory(@sfo, SizeOf(TSHFileOpStruct));
      sfo.pFrom := WideBuf;
      // 此处执行SHFileOperation(sfo)操作
    finally
      FreeMem(WideBuf);
    end;
  finally
    SL.Free;
  end;
end;

方案2:手动构建Unicode字符串

通过SetLength预先分配足够内存,避免#0截断问题,手动复制字符串并补充分隔符:

procedure TForm13.Button1Click(Sender: TObject);
var
  s: UnicodeString;
  sfo: TSHFileOpStruct;
  P: PWideChar;
begin
  // 计算总长度:两个文件名长度 + 3个#0(1个分隔符 + 2个结尾符)
  SetLength(s, Length('123') + Length('456') + 3);
  P := PWideChar(s);
  
  // 复制第一个文件名
  StrPCopy(P, '123');
  // 移动指针到第一个文件名末尾的#0之后
  Inc(P, Length('123') + 1);
  // 复制第二个文件名
  StrPCopy(P, '456');
  
  ZeroMemory(@sfo, SizeOf(TSHFileOpStruct));
  sfo.pFrom := PWideChar(s);
  // 此处执行SHFileOperation(sfo)操作
end;

原代码失效说明

原代码中s:='123'+#0+'456'+#0;的拼接逻辑在UnicodeString中不成立:字符串操作会将第一个#0识别为结束标记,最终s仅保留'123',后续的#0和'456'被直接丢弃,转PWideChar自然只能拿到'123'。

内容的提问来源于stack exchange,提问作者MrQNet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:35:17