网上找的一段代码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;我很奇怪,上面红色部分第一次是正确的,第二次开始就不对了,提示无效的窗口句柄,可是我看大家都是类似上面这么做的啊
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;我很奇怪,上面红色部分第一次是正确的,第二次开始就不对了,提示无效的窗口句柄,可是我看大家都是类似上面这么做的啊
解决方案 »
- SQL不知为什么出错
- 使用Delphi做进销存,是使用Access好,还是用BDE或Interbase好呢?
- ★★★请问我用Delphi Formatter Expert来格式化我的代码格式,为什么进入delphi时提示i/o error 103,急呀,谢谢!!★★★
- dxDbGrid如何在数据记录移动时判断其数据合法性,不合法的话 不post,回到原编辑行
- 請教各位如何在已知的字串中獲取字串??
- 关于用DeDe和UE改写EXE文件的问题,高手请进!!!
- 鲍岳桥-他现在在做什么?
- 修改表里的数据问题?
- 3000元找人开发一款浏览器辅助程序
- 继续问问题.关于报表打印的
- 纠错:给pbyte变量赋值出错。错误:Missing operator or semicolon
- 设计程序
//关闭文件映射
CloseHandle(sMapHandle);
1.建议楼主不要在映射成功后,就不要做unmap了
否则映射没有意义
2.在做分段映射的时候需要调用GetSystemInfo函数来获取dwAllocationGranularity值来参考分段大小,具体可以见msdn
http://msdn.microsoft.com/en-us/library/aa366761(v=VS.85).aspx
然后 GetSystemInfo(SysInfo);
BufferSize:=Sysinfo.dwAllocationGranularity;按照楼上说的这样都不行,请问dd_zhouqian什么环境啊,我是xp sp3 D7,D2007都试了就是报错无效的窗口句柄,这也太神奇了