网上找的一段代码procedure TForm1.MapMemoryFileCopy(SourceFileName:string);
const
  BufferSize=1024*1024*64;
var
  SourceHandle:THandle;               //源文件句柄
  TargetHandle:THandle;               //目标文件句柄
  FSize:Cardinal;                     //文件低32位大小
  HighSize:Cardinal;                  //文件高32位大小
  TotalSize:int64;                    //文件總體積
  sMapHandle:THandle;                 //源文件内存映射句柄
  PSource:Pointer;                    //源文件内存映射视图地址
  StartPos:int64;
  MapSize:Cardinal;
  function High32(num:int64):Cardinal;
  begin
    move(pchar(longint(@num)+sizeof(cardinal))^,pchar(@result)^,sizeof(cardinal));
  end;  function Low32(num:int64):Cardinal;
  begin
    move(pchar(@num)^,pchar(@result)^,sizeof(cardinal));
  end;
begin
  //源文件
 
  SourceHandle:=CreateFile(PChar(SourceFileName),GENERIC_ALL,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  FSize:=GetFileSize(SourceHandle,@HighSize);
  TotalSize:=HighSize*1024*1024*1024*4+FSize;  sMapHandle:=CreateFileMapping(SourceHandle,nil,PAGE_READWRITE,0,FSize,pchar('zystudios'));
  CloseHandle(SourceHandle);
  //初始化变量
  StartPos:=0;
  MapSize:=BufferSize;  while StartPos<TotalSize do
  begin
    if StartPos+BufferSize>TotalSize then
      MapSize:=TotalSize-StartPos;
    //创建映射视图,获得的PSource指针,可以和操作普通指针一样进行内存操作
    PSource:=MapViewOfFile(sMapHandle,FILE_MAP_READ or FILE_MAP_WRITE,high32(StartPos) ,low32(StartPos),MapSize);    showmessage(syserrormessage(getlasterror()));    StartPos:=StartPos+MapSize;
    //取消内存映射视图    UnMapViewOfFile(PSource);  end;
  //关闭文件映射
  CloseHandle(sMapHandle);end;我很奇怪,上面红色部分第一次是正确的,第二次开始就不对了,提示无效的窗口句柄,可是我看大家都是类似上面这么做的啊

解决方案 »

  1.   

    while 循环里你已经做了
      //关闭文件映射
      CloseHandle(sMapHandle);
      

  2.   

    刚刚测试了下没有出现楼主所说的问题,
    1.建议楼主不要在映射成功后,就不要做unmap了
    否则映射没有意义
    2.在做分段映射的时候需要调用GetSystemInfo函数来获取dwAllocationGranularity值来参考分段大小,具体可以见msdn
    http://msdn.microsoft.com/en-us/library/aa366761(v=VS.85).aspx
      

  3.   

    我是xp sp3 ntfs的分区,奇怪了,死活都是无效的窗口句柄,不管我把分段设置多少都这个错误
      

  4.   

     把const的BufferSize改为var
    然后  GetSystemInfo(SysInfo);
      BufferSize:=Sysinfo.dwAllocationGranularity;按照楼上说的这样都不行,请问dd_zhouqian什么环境啊,我是xp sp3 D7,D2007都试了就是报错无效的窗口句柄,这也太神奇了
      

  5.   

    MapSize := 65536你试试