内存映射文件 尾

原创 2005年03月02日 20:45:00
使用内存映射文件在进程间共享数据
步骤:1调用OpenFileMapping打开一个命名的内存映像文件对象。得到hFileMap。如果成功跳转到步骤3。否则继续执行步骤2
      2调用CreatFileMapping函数创建一个命名的的内存映射文件,得到hFileMap。
      3调用MapViewOfFile得到指向映射到内存中的第一个字节lpMemory
      4用该指针来读写共享数据
      5调用UnmapViewOfFile
      6调用CloseHandle
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming >
; by 罗云彬, ::URL::http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; MMFShare.asm
; 使用内存映射文件进行进程间数据共享
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff MMFShare.asm
; rc MMFShare.rc
; Link /subsystem:windows MMFShare.obj MMFShare.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .386
        .model flat, stdcall
        option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    equ        1000
DLG_MAIN    equ        100
IDC_TXT        equ        101
IDC_INFO    equ        102
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?

hInstance    dd    ?
hWinMain    dd    ?
hFileMap    dd    ?
lpMemory    dd    ?

        .const
szErr        db    '无法建立内存共享文件',0
szMMFName    db    'MMF_Share_Example',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CreateMMF    proc

        invoke    OpenFileMapping,FILE_MAP_READ or FILE_MAP_WRITE,0,addr szMMFName
        .if    ! eax
            invoke    CreateFileMapping,-1,NULL,PAGE_READWRITE,0,4096,addr szMMFName
            .if    ! eax
                jmp    @F
            .endif
        .endif
        mov    hFileMap,eax
        invoke    MapViewOfFile,eax,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0
        .if    eax
            mov    lpMemory,eax
            mov    dword ptr [eax],0
            ret
        .endif
        invoke    CloseHandle,hFileMap
@@:
        invoke    MessageBox,hWinMain,addr szErr,NULL,MB_OK
        invoke    EndDialog,hWinMain,-1
        ret

_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
对程序的几点说明:
1. 程序本身的结构很简单,首先调用_ProcDlgMain子程序建立了一个计时器,以便检测用户是否向对话框输入内容,并将内容通过SetDlgItemText函数传递给每个进程显示。在初始化时调用创建内存映射文件函数。接下来转到上面说的6个步骤中。
2. 当关掉一个进程时不影响其它进程的共享数据,因为系统会为进程共享的映射文件对象维护一个计数器,每次有进程打开映射文件对象的时候,计数器都会加1,关闭的时候减1。只有当计数器的值为0时内存映射文件才会真正被释放:)


Java nio 之 内存映射文件

本文整理自《Java NIO》一书。
  • liuyuhua0066
  • liuyuhua0066
  • 2014年05月16日 15:36
  • 1172

内存映射文件 C#

using System; using System.IO.MemoryMappedFiles; using System.Text; namespace MappedMemoryFiles { ...
  • TKDwave520
  • TKDwave520
  • 2015年11月03日 00:06
  • 829

IPC之Posix内存映射文件详解

1.什么是内存映射文件 内存映射文件,就是把磁盘上的物理文件映射至进程地址空间中,使用内存映射文件的特性是,所有的I/O都是在内核掩盖下完成,我们只需编写存取内存映射区中各个值的代码,也就是不需要...
  • daiyudong2020
  • daiyudong2020
  • 2016年01月10日 20:44
  • 948

内存映射文件来处理大文件可以提高效率

先说结论:使用内存映射文件来处理大文件可以提高效率。  为什么呢? 我们先来看看如果不使用内存映射文件的处理流程是怎样的,首先我们得先读出磁盘文件的内容到内存中,然后修改,最后回写到磁盘上...
  • lanwanjunxixihaha
  • lanwanjunxixihaha
  • 2015年06月18日 18:06
  • 1107

使用内存映射文件

若要使用内存映射文件,必须执行下列操作步骤:1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件。2) 创建一个文件映射内核对象,告诉系统该文件的大小和你打算如何访问该文件...
  • hongjiqin
  • hongjiqin
  • 2007年09月06日 16:47
  • 4568

WINDOWS内存映射文件原理分析+代码演示

WINDOWS为任何一个进程都赋予了4G的独立的虚拟地址空间,然而学过OS的都晓得这个只是逻辑上的虚拟的地址空间,进程实际拥有的远小于4GB的物理地址空间。并且进程的虚拟地址空间是每个进程私有的,有操...
  • yiruirui0507
  • yiruirui0507
  • 2011年03月31日 23:57
  • 4744

Java I/O内存映射方法实现对大文件的内存操作

操作系统对内存一次读取的数据大小有要求,但是对于i/O系统,读取大文件是很必要的事情,所以,可以使用内存映射文件系统实现对大文件的读取   代码如下 package com.bird.thinki...
  • a352193394
  • a352193394
  • 2011年10月20日 19:55
  • 2083

Delphi内存映射文件例子

unit  FileMap;   interface   uses     Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,StdC...
  • whd0310
  • whd0310
  • 2007年07月19日 17:15
  • 3821

c# 内存共享、内存映射文件、适合读取大文件

using System;   using System.Collections.Generic;   using System.Text;   using System.Runtime.Intero...
  • MySpringNet
  • MySpringNet
  • 2011年03月29日 11:38
  • 877

java各种数据类型在内存中的存储方式

原文:https://www.cnblogs.com/yale/p/4605004.html 1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题。(其中包括两...
  • Dzq_Boyka
  • Dzq_Boyka
  • 2018年01月09日 14:11
  • 34
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存映射文件 尾
举报原因:
原因补充:

(最多只允许输入30个字)