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
相关产品推荐
相关产品推荐

