WIN32汇编语言教程:第10章 内存管理和文件操作 · 10.4 内存映射文件(4)
_CreateMMF endp ;#################################################################### _CloseMMF proc invoke UnmapViewOfFile,lpMemory invoke CloseHandle,hFileMap mov lpMemory,0 mov hFileMap,0 ret _CloseMMF endp ;#################################################################### _ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam local @szBuffer[4096]:byte mov eax,wMsg .if eax == WM_TIMER invoke SetDlgItemText,hWnd,IDC_INFO,lpMemory .elseif eax == WM_CLOSE invoke KillTimer,hWnd,1 invoke _CloseMMF invoke EndDialog,hWinMain,0 ;******************************************************************** .elseif eax == WM_INITDIALOG push hWnd pop hWinMain invoke LoadIcon,hInstance,ICO_MAIN invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax invoke SendDlgItemMessage,hWnd,IDC_TXT,\ EM_SETLIMITTEXT,100,0 invoke _CreateMMF invoke SetTimer,hWnd,1,200,NULL ;******************************************************************** .elseif eax == WM_COMMAND mov eax,wParam .if ax == IDC_TXT && lpMemory invoke GetDlgItemText,hWnd,IDC_TXT,\ lpMemory,4096 .endif ;******************************************************************** .else mov eax,FALSE ret .endif mov eax,TRUE ret _ProcDlgMain endp ;#################################################################### start: invoke GetModuleHandle,NULL mov hInstance,eax invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,\ offset _ProcDlgMain,NULL invoke ExitProcess,NULL ;#################################################################### end start
对应的资源脚本文件MMFShare.rc如下:
#include <resource.h> #define ICO_MAIN 1000 #define DLG_MAIN 100 #define IDC_TXT 101 #define IDC_INFO 102 ICO_MAIN ICON "Main.ico" DLG_MAIN DIALOG 229, 208, 211, 55 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "内存映射文件共享" FONT 9, "宋体" { LTEXT "请执行本程序的多个拷贝,并尝试在下面输入文本:", -1, 7, 8, 196, 8 EDITTEXT IDC_TXT, 7, 22, 197, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP LTEXT "", IDC_INFO, 8, 41, 196, 8 }
程序的结构异常简单,首先在用做主界面的对话框的初始化消息中创建内存映射文件(在_CreateMMF子程序中完成),并建立一个定时器,用来不停地将共享区域的内容设置到文本框中。在这里,内存映射文件对象的名称是“MMF_Share_Example”,别的进程只要知道这个名称,就可以使用它。
程序在WM_COMMAND消息中检测编辑框的输入动作,如果用户在编辑框中输入了字符,那么马上将编辑框的内容取到共享区域中,这样,其他进程在定时器消息中就可以马上将这个内容在自己窗口的文本框中反映出来
在退出的时候,程序在_CloseMMF子程序中调用UnmapViewOfFile和CloseHandle函数来关闭内存映射文件,并在撤销定时器后退出。
当程序运行多个副本的时候,内存映射文件是由首先运行的副本建立的,但是在退出的时候,即使首先运行的副本先退出(也就是说创建内存映射文件的副本首先退出),其他副本之间的通信也不受影响,这就是说,这时内存映射文件还是存在的。实际上,系统为进程间共享的内存映射文件对象维护一个计数器,每次有进程打开内存映射文件对象的时候,计数器加1,关闭的时候减1,只有当计数器减到零的时候,内存映射文件才真正被释放,所以程序中关闭内存映射文件的时候并不需要考虑别的程序是否还在使用它。
上页:第10章 内存管理和文件操作 · 10.4 内存映射文件(3) 下页:第11章 动态链接库和钩子 · 11.1 动态链接库(1)
第10章 内存管理和文件操作
版权所有 © 云南伯恩科技 证书:粤ICP备09170368号