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号