关于内存映射文件的使用问题!希望知道的朋友指点一下
;步骤:建立或打开文件,完成映射,读写文件,关闭.;------------------------------------------------------------------------------
.const
szFileName db 'Readme.txt',0
;------------------------------------------------------------------------------
.code
_WriteFile proc _hWnd,_lpBuffer
local @hFile,@hMapFile,@lpMemory
local @dwFileSize:DWORD
pushad
invoke CreateFile,addr szFileName,GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_HIDDEN,NULL
.if eax == INVALID_HANDLE_VALUE
invoke MessageBox,_hWnd,NULL,NULL,MB_OK
ret
.endif
mov @hFile,eax
;获取文件长度
invoke GetFileSize,@hFile,NULL
mov @dwFileSize,eax
invoke CreateFileMapping,@hFile,NULL,PAGE_READWRITE,0,128*1024,NULL
;问题就出现在这个函数的第5个参数上,由于是建立新文件,如果此参为0,竟然无法创建对象;如果太大,如是1M以上,则今后竟然出现未知的读写错误!不知道朋友遇到过,给说下!
.if !eax
invoke MessageBox,_hWnd,NULL,NULL,MB_OK
jmp _Ret1
.endif
mov @hMapFile,eax
invoke MapViewOfFile,eax,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0
.if !eax
invoke MessageBox,_hWnd,NULL,NULL,MB_OK
jmp _Ret2
.endif
mov @lpMemory,eax
mov edi,eax
mov esi,_lpBuffer
;文件字符数计数器清0
xor ecx,ecx
@@:
mov al,[edi]
;检测是否处于字符串的末尾
cmp al,0
je @F
inc edi
inc ecx
;检测是否到了文件的末尾,;到了就不写文件,直接退出
cmp ecx,@dwFileSize-4
jnb _end
jmp @B
@@:
mov al,[esi]
;检测待写字符串是否已读取完毕
cmp al,0
je @F
;写文件
mov [edi],al
inc esi
inc edi
jmp @B
@@:
_end:
invoke UnmapViewOfFile,@lpMemory
_Ret2:
invoke CloseHandle,@hMapFile
_Ret1:
invoke CloseHandle,@hFile
popad
ret
_WriteFile endp
;------------------------------------------------------------------------------
[ 本帖最后由 ONEPROBLEM 于 2010-4-22 08:00 编辑 ]