资源预览内容
第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
亲,该文档总共7页全部预览完了,如果喜欢就下载吧!
资源描述
本课中我们将要讲解内存映射文件并且演示如何运用它。您将会发觉使用内存映射文件是非常简单的。 理论:如果您仔细地研究了前一课的例子, 就会发觉它有一个严峻的缺陷:如果您想读的内容大于系统分配的内存块怎么办?如果您想搜索的字符串刚好超过内存块的边界又该如何处理?对于第一个问题,您也许会说,只需不断地读就疑惑决了吗。至于第二个问题,您又会说在内存块的边界处做一些特别的处理,譬如放上一些标志位就能够了。原理上确实是行得通,但是这随问题复杂程度加深而显得非常难以处理。其中的第二个问题是有名的边界判断问题,程序中许许多多的错误都是由此引起。想一想,如果我们能够分配一个能够容纳整个文件的大内存块该多好啊,这样这两个问题不都迎刃而解了吗?是的,WIN32的内存映射文件确实允许我们分配一个装得下现实中可能具有的脚够大的文件的内存。利用内存映射文件您能够认为操做系统已经为您把文件全部装入了内存,然后您只需移动文件指针进行读写即可了。这样您以至不需要调用那些分配、释放内存块和文件输入/输出的API函数,另外您能够把这用做不同的进程之间共享数据的一种办法。运用内存映射文件实际上没有涉及实际的文件操做,它更象为每个进程保留一个看得见的内存空间。至于把内存映射文件当成进程间共享数据的办法来用,则要加倍小心,因为您不得不处理数据的同步问题,否则您的应用程序也许很可能得到过时或错误的数据以至崩溃。本课中我们将主要讲述内存映射文件,将不涉及进程间的同步。WIN32中的内存映射文件应用非常广泛,譬如:即便是系统的核心模块-PE格式文件装载器也用到了内存映射文件,因为PE格式的文件并不是一次性加载到内存中来的,譬如他它在初次加载时只加载必需加载的部分,而其他部分在用到时再加载,这正好能够利用到内存映射文件的长处。实际中的大多数文件存取都和PE加载器类似,所以您在处理该类问题时也应该充分利用内存映射文件。内存映射文件本身还是有一些局限性的,譬如一旦您生成了一个内存映射文件,那么您在那个会话期间是不能够改变它的大小的。所以内存映射文件对于只读文件和不会影响其大小的文件操做是非常有用的。当然这并不意味着对于会引起改变其大小的文件操做就一定不能用内存影射文件的方法,您能够事先估计操做后的文件的可能大小,然后生成这么大小一块的内存映射文件,然后文件的长度就能够增长到这么一个大小。 我们的注释够多的了,接下来我们就看看实现的细节: 调用CreateFile打开您想要映射的文件。 调用CreateFileMapping,其中要求传入先前CreateFile前往的句柄,该函数生成一个建立在CreateFile函数创建的文件对象基础上的内存映射对象。 调用MapViewOfFile函数映射整个文件的一个区域或者整个文件到内存。该函数前往指向映射到内存的第一个字节的指针。 用该指针来读写文件。 调用UnmapViewOfFile来解除文件映射。 调用CloseHandle来关闭内存映射文件。注意必须传入内存映射文件的句柄。 调用CloseHandle来关闭文件。注意必须传入由CreateFile创建的文件的句柄。 例子:下面的例子允许用户通过“打开文件”对话框来打开一个文件,然后用内存映射文件来打开该文件,如果成功,窗口的标题条会显示打开的文件的名称,您能够通过选择“File/Save”菜单项来把换名保存。该程序将会把打开的文件的内容存到新文件中去。注意,这整个过程您根本就没有用到GlobalAlloc这样的分配内存的函数。 .386 .model flat,stdcall WinMain proto WORD,WORD,WORD,WORD include masm32includewindows.inc include masm32includeuser32.inc include masm32includekernel32.inc include masm32includecomdlg32.inc includelib masm32libuser32.lib includelib masm32libkernel32.lib includelib masm32libcomdlg32.lib .const IDM_OPEN equ 1 IDM_SAVE equ 2 IDM_EXIT equ 3 MAXSIZE equ 260 .data ClassName db Win32ASMFileMappingClass,0 AppName db Win32 ASM File Mapping Example,0 MenuName db FirstMenu,0 ofn OPENFILENAME FilterString db All Files,0,*.*,0 db Text Files,0,*.txt,0,0 来源:www.va1314.com/bcbuffer db MAXSIZE dup(0) hMapFile HANDLE 0 ; Handle to the memory mapped file, must be ;initialized with 0 because we also use it as ;a flag in WM_DESTROY section too .data? hInstance HINSTANCE ? CommandLine LPSTR ? hFileRead HANDLE ? ; Handle to the source file hFileWrite HANDLE ? ; Handle to the output file hMenu HANDLE ? pMemory DWORD ? ; pointer to the data in the source file SizeWritten DWORD ? ; number of bytes actually written by WriteFile .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLinePSTR,CmdShowWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,OFFSET MenuName mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName, ADDR AppName, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,300,200,NULL,NULL, hInst,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParamPARAM .IF uMsg=WM_CREATE invoke GetMenu,hWnd ;Obtain the menu handle mov hMenu,eax mov ofn.lStructSize,SIZEOF ofn push hWnd pop ofn.hWndOwner push hInstance pop ofn.hInstance mov ofn.lpstrFilter, OFFSET FilterString mov ofn.lpstrFile, OFFSET buffer mov ofn.nMaxFile,MAXSIZE .ELSEIF uMsg=WM_DESTROY .if hMapFile!=0 call CloseMapFile .endif invoke PostQuitMessage,NULL .ELSEIF uMsg=WM_COMMAND mov eax,wParam .if lParam=0 .if ax=IDM_OPEN mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY invoke GetOpenFileName, ADDR ofn .if eax=TRUE invoke CreateFile,ADDR buffer, GENERIC_READ , 0, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE, NULL mov hFileRead,eax invoke CreateFileMapping,hFileRead,NULL,PAGE_READONLY,0,0,NULL mov hMapFile,eax mov eax,OFFSET buffer movzx edx,ofn.nFileOffset add eax,edx invoke SetWindowText,hWnd,eax invoke EnableMenuItem,hMenu,IDM_OPEN,MF_GRAYED invoke EnableMenuItem,hMenu,IDM_SAVE,MF_ENABLED .endif .elseif ax
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号