我也遇到过这个问题,比如大数据量的文件复制。
string类型字符串末尾就一个空终止符。
  
我看的资料上说pFrom指向的buffer要双#0结尾
pFrom := PChar(AFileSrc); 你传进的字符串必须是双#0结尾----就是字符缓冲区要以双#0结尾。
另外FillChar(fo, SizeOf(fo), #0);这个改一下。你改改试试
另外我给你一个其它的例程也许对你有用uses ShellAPI; procedure TForm1.Button1Click(Sender: TObject); 
var 
Fo      : TSHFileOpStruct; 
buffer  : array[0..4096] of char; 
p       : pchar; begin 
  FillChar(Buffer, sizeof(Buffer), #0); 
  p := @buffer; 
  p := StrECopy(p, 'C:\DownLoad\1.ZIP') + 1; 
  p := StrECopy(p, 'C:\DownLoad\2.ZIP') + 1; 
  p := StrECopy(p, 'C:\DownLoad\3.ZIP') + 1; 
  StrECopy(p, 'C:\DownLoad\4.ZIP');   FillChar(Fo, sizeof(Fo), #0); 
  Fo.Wnd    := Handle; 
  Fo.wFunc  := FO_COPY; 
  Fo.pFrom  := @Buffer; 
  Fo.pTo    := 'D:\'; 
  Fo.fFlags := 0; 
  if ((SHFileOperation(Fo) <> 0) or 
      (Fo.fAnyOperationsAborted <> false)) then 
    ShowMessage('Cancelled') 
end;