使用内存映射的方法完成多个程序间的信息共享

在WIN32种,通过使用映像文件在进程间实现共享文件或内存共享,如果利用相同的映像名字或文件句柄,则不同的进程可以通过一个指针来读写同一个文件或者同一内存数据块,并把他们当成该进程内存空间的一部分。
    内存映像文件可以映射一个文件、一个文件中的指定区域或者指定的内存块,其中的数据就可以用内存读取指令来直接访问,而不用频繁的使用操作文件的I/O系统函数,从而提高文件的存取速度和效率。
    映像文件的另一个重要作用就是用来支持永久命名的共享内存。要在两个应用程序之间共享内存,可以在一个应用程序中创建一个文件并映射,然后另外一个程序通过打开和映射此文件,并把它当作自己进程的内存来使用。事实上,此内存是所有进程共享的。

    下面将先描述一下几个操作内存的API函数

1、创建内存映射的API函数

使用内存映射的方法完成多个程序间的信息共享This function creates a named or unnamed file-mapping object for the specified file.
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享HANDLE CreateFileMapping(
使用内存映射的方法完成多个程序间的信息共享
//通过调用fileopen or FileCreate后返回的文件句柄,如果是内存,则//$FFFFFFFF
使用内存映射的方法完成多个程序间的信息共享
  HANDLE hFile, 
使用内存映射的方法完成多个程序间的信息共享   
//安全性结构,一般null
使用内存映射的方法完成多个程序间的信息共享
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes, 
使用内存映射的方法完成多个程序间的信息共享   
//文件试图的保护类型,PAGE_READONLY,PAGE_READWRITE,
使用内存映射的方法完成多个程序间的信息共享
  DWORD flProtect, 
使用内存映射的方法完成多个程序间的信息共享  
//文件大小的高32位,一般设置为0,除非文件大于4G
使用内存映射的方法完成多个程序间的信息共享
  DWORD dwMaximumSizeHigh, 
使用内存映射的方法完成多个程序间的信息共享  
//文件大小低32位
使用内存映射的方法完成多个程序间的信息共享
  DWORD dwMaximumSizeLow, 
使用内存映射的方法完成多个程序间的信息共享  
//映射的名字
使用内存映射的方法完成多个程序间的信息共享
  LPCTSTR lpName 
使用内存映射的方法完成多个程序间的信息共享);
使用内存映射的方法完成多个程序间的信息共享


2、打开一个映射文件

使用内存映射的方法完成多个程序间的信息共享HANDLE OpenFileMapping(
使用内存映射的方法完成多个程序间的信息共享  
//访问数据模式:FILE_MAP_ALL_ACCESS,FILE_MAP_COPY,FILE_MAP_READ,  //FILE_MAP_WRITE
使用内存映射的方法完成多个程序间的信息共享
  DWORD dwDesiredAccess,
使用内存映射的方法完成多个程序间的信息共享  
//子进程是否可以继承
使用内存映射的方法完成多个程序间的信息共享
  BOOL bInheritHandle,
使用内存映射的方法完成多个程序间的信息共享  
//映射文件名
使用内存映射的方法完成多个程序间的信息共享
  LPCTSTR lpName
使用内存映射的方法完成多个程序间的信息共享);

 

3、将映射文件映射到本进程的API函数

使用内存映射的方法完成多个程序间的信息共享LPVOID MapViewOfFile( 
使用内存映射的方法完成多个程序间的信息共享  
//通过CreateFileMapping或OpenFileMapping返回的文件句柄
使用内存映射的方法完成多个程序间的信息共享
  HANDLE hFileMappingObject, 
使用内存映射的方法完成多个程序间的信息共享  
//访问的数据模式:FILE_MAP_WRITE,FILE_MAP_READ,FILE_MAP_ALL_ACCESS
使用内存映射的方法完成多个程序间的信息共享
  DWORD dwDesiredAccess, 
使用内存映射的方法完成多个程序间的信息共享  
//指定数据在映射文件中起始位置的高32位
使用内存映射的方法完成多个程序间的信息共享
  DWORD dwFileOffsetHigh, 
使用内存映射的方法完成多个程序间的信息共享  
//低32位
使用内存映射的方法完成多个程序间的信息共享
  DWORD dwFileOffsetLow, 
使用内存映射的方法完成多个程序间的信息共享  
//需要映射的大小,0表示全部
使用内存映射的方法完成多个程序间的信息共享
  DWORD dwNumberOfBytesToMap 
使用内存映射的方法完成多个程序间的信息共享);


4、关闭映射的api函数

使用内存映射的方法完成多个程序间的信息共享BOOL UnmapViewOfFile( 
使用内存映射的方法完成多个程序间的信息共享  
//由MapViewofFile产生的映射文件的地址

使用内存映射的方法完成多个程序间的信息共享
  LPCVOID lpBaseAddress 
使用内存映射的方法完成多个程序间的信息共享);

5、下面例子中还会用到的几个api函数

使用内存映射的方法完成多个程序间的信息共享创建互斥对象
使用内存映射的方法完成多个程序间的信息共享HANDLE WINAPI CreateMutex(
使用内存映射的方法完成多个程序间的信息共享  LPSECURITY_ATTRIBUTES lpMutexAttributes,
使用内存映射的方法完成多个程序间的信息共享  BOOL bInitialOwner,
使用内存映射的方法完成多个程序间的信息共享  LPCTSTR lpName
使用内存映射的方法完成多个程序间的信息共享);
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享DWORD WaitForSingleObject( 
使用内存映射的方法完成多个程序间的信息共享  HANDLE hHandle, 
使用内存映射的方法完成多个程序间的信息共享  DWORD dwMilliseconds 
使用内存映射的方法完成多个程序间的信息共享); 
使用内存映射的方法完成多个程序间的信息共享

     上文中曾经提到我们使用内存映射的方式来在多个程序或DLL中共享数据。下面就通过一个程序来介绍。

    虽然我要描述的是再两个应用程序之间共享数据,不过为了省事,我将所有的内容都写在一个程序中,你只需要把此程序打开两次就可以了。一个程序用来建立内存映射文件,另外一个程序用来打开内存映射文件。并通过对公共内存的读写操作来演示信息共享。

    程序的窗体单元代码如下:

使用内存映射的方法完成多个程序间的信息共享object Form1: TForm1
使用内存映射的方法完成多个程序间的信息共享  Left 
= 236
使用内存映射的方法完成多个程序间的信息共享  Top 
= 147
使用内存映射的方法完成多个程序间的信息共享  Width 
= 327
使用内存映射的方法完成多个程序间的信息共享  Height 
= 412
使用内存映射的方法完成多个程序间的信息共享  Caption 
= 'MyMapForm_1'
使用内存映射的方法完成多个程序间的信息共享  Color 
= clBtnFace
使用内存映射的方法完成多个程序间的信息共享  Font.Charset 
= ANSI_CHARSET
使用内存映射的方法完成多个程序间的信息共享  Font.Color 
= clWindowText
使用内存映射的方法完成多个程序间的信息共享  Font.Height 
= -13
使用内存映射的方法完成多个程序间的信息共享  Font.Name 
= '宋体'
使用内存映射的方法完成多个程序间的信息共享  Font.Style 
= []
使用内存映射的方法完成多个程序间的信息共享  OldCreateOrder 
= False
使用内存映射的方法完成多个程序间的信息共享  OnClose 
= FormClose
使用内存映射的方法完成多个程序间的信息共享  OnCreate 
= FormCreate
使用内存映射的方法完成多个程序间的信息共享  PixelsPerInch 
= 96
使用内存映射的方法完成多个程序间的信息共享  TextHeight 
= 13
使用内存映射的方法完成多个程序间的信息共享  
object GroupBox1: TGroupBox
使用内存映射的方法完成多个程序间的信息共享    Left 
= 0
使用内存映射的方法完成多个程序间的信息共享    Top 
= 0
使用内存映射的方法完成多个程序间的信息共享    Width 
= 319
使用内存映射的方法完成多个程序间的信息共享    Height 
= 121
使用内存映射的方法完成多个程序间的信息共享    Align 
= alTop
使用内存映射的方法完成多个程序间的信息共享    Caption 
= '共享内存的信息[发送]'
使用内存映射的方法完成多个程序间的信息共享    TabOrder 
= 0
使用内存映射的方法完成多个程序间的信息共享    
object Label1: TLabel
使用内存映射的方法完成多个程序间的信息共享      Left 
= 16
使用内存映射的方法完成多个程序间的信息共享      Top 
= 24
使用内存映射的方法完成多个程序间的信息共享      Width 
= 26
使用内存映射的方法完成多个程序间的信息共享      Height 
= 13
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '数据'
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object Label2: TLabel
使用内存映射的方法完成多个程序间的信息共享      Left 
= 16
使用内存映射的方法完成多个程序间的信息共享      Top 
= 48
使用内存映射的方法完成多个程序间的信息共享      Width 
= 39
使用内存映射的方法完成多个程序间的信息共享      Height 
= 13
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '修改者'
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object Label3: TLabel
使用内存映射的方法完成多个程序间的信息共享      Left 
= 16
使用内存映射的方法完成多个程序间的信息共享      Top 
= 80
使用内存映射的方法完成多个程序间的信息共享      Width 
= 52
使用内存映射的方法完成多个程序间的信息共享      Height 
= 13
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '修改时间'
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object edData: TEdit
使用内存映射的方法完成多个程序间的信息共享      Left 
= 75
使用内存映射的方法完成多个程序间的信息共享      Top 
= 21
使用内存映射的方法完成多个程序间的信息共享      Width 
= 230
使用内存映射的方法完成多个程序间的信息共享      Height 
= 21
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 0
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object edModifyUser: TEdit
使用内存映射的方法完成多个程序间的信息共享      Left 
= 74
使用内存映射的方法完成多个程序间的信息共享      Top 
= 49
使用内存映射的方法完成多个程序间的信息共享      Width 
= 231
使用内存映射的方法完成多个程序间的信息共享      Height 
= 21
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 1
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object edModifyTime: TEdit
使用内存映射的方法完成多个程序间的信息共享      Left 
= 74
使用内存映射的方法完成多个程序间的信息共享      Top 
= 73
使用内存映射的方法完成多个程序间的信息共享      Width 
= 231
使用内存映射的方法完成多个程序间的信息共享      Height 
= 21
使用内存映射的方法完成多个程序间的信息共享      Enabled 
= False
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 2
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享  end
使用内存映射的方法完成多个程序间的信息共享  
object Panel1: TPanel
使用内存映射的方法完成多个程序间的信息共享    Left 
= 0
使用内存映射的方法完成多个程序间的信息共享    Top 
= 242
使用内存映射的方法完成多个程序间的信息共享    Width 
= 319
使用内存映射的方法完成多个程序间的信息共享    Height 
= 121
使用内存映射的方法完成多个程序间的信息共享    Align 
= alClient
使用内存映射的方法完成多个程序间的信息共享    BevelOuter 
= bvNone
使用内存映射的方法完成多个程序间的信息共享    TabOrder 
= 1
使用内存映射的方法完成多个程序间的信息共享    
object btnCreate: TButton
使用内存映射的方法完成多个程序间的信息共享      Left 
= 32
使用内存映射的方法完成多个程序间的信息共享      Top 
= 8
使用内存映射的方法完成多个程序间的信息共享      Width 
= 113
使用内存映射的方法完成多个程序间的信息共享      Height 
= 25
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '新建内存映射'
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 0
使用内存映射的方法完成多个程序间的信息共享      OnClick 
= btnCreateClick
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object btnOpen: TButton
使用内存映射的方法完成多个程序间的信息共享      Left 
= 160
使用内存映射的方法完成多个程序间的信息共享      Top 
= 8
使用内存映射的方法完成多个程序间的信息共享      Width 
= 113
使用内存映射的方法完成多个程序间的信息共享      Height 
= 25
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '打开已存在映射'
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 1
使用内存映射的方法完成多个程序间的信息共享      OnClick 
= btnOpenClick
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object btnRead: TButton
使用内存映射的方法完成多个程序间的信息共享      Left 
= 160
使用内存映射的方法完成多个程序间的信息共享      Top 
= 45
使用内存映射的方法完成多个程序间的信息共享      Width 
= 113
使用内存映射的方法完成多个程序间的信息共享      Height 
= 25
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '读取映射信息'
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 2
使用内存映射的方法完成多个程序间的信息共享      OnClick 
= btnReadClick
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object btnSet: TButton
使用内存映射的方法完成多个程序间的信息共享      Left 
= 32
使用内存映射的方法完成多个程序间的信息共享      Top 
= 45
使用内存映射的方法完成多个程序间的信息共享      Width 
= 113
使用内存映射的方法完成多个程序间的信息共享      Height 
= 25
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '设置内存信息'
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 3
使用内存映射的方法完成多个程序间的信息共享      OnClick 
= btnSetClick
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object btnClose: TButton
使用内存映射的方法完成多个程序间的信息共享      Left 
= 32
使用内存映射的方法完成多个程序间的信息共享      Top 
= 85
使用内存映射的方法完成多个程序间的信息共享      Width 
= 113
使用内存映射的方法完成多个程序间的信息共享      Height 
= 25
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '关闭映射'
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 4
使用内存映射的方法完成多个程序间的信息共享      OnClick 
= btnCloseClick
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object btnClear: TButton
使用内存映射的方法完成多个程序间的信息共享      Left 
= 160
使用内存映射的方法完成多个程序间的信息共享      Top 
= 85
使用内存映射的方法完成多个程序间的信息共享      Width 
= 113
使用内存映射的方法完成多个程序间的信息共享      Height 
= 25
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '清空编辑狂'
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 5
使用内存映射的方法完成多个程序间的信息共享      OnClick 
= btnClearClick
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享  end
使用内存映射的方法完成多个程序间的信息共享  
object StatusBar1: TStatusBar
使用内存映射的方法完成多个程序间的信息共享    Left 
= 0
使用内存映射的方法完成多个程序间的信息共享    Top 
= 363
使用内存映射的方法完成多个程序间的信息共享    Width 
= 319
使用内存映射的方法完成多个程序间的信息共享    Height 
= 19
使用内存映射的方法完成多个程序间的信息共享    Panels 
= <
使用内存映射的方法完成多个程序间的信息共享      item
使用内存映射的方法完成多个程序间的信息共享        Width 
= 200
使用内存映射的方法完成多个程序间的信息共享      end
>
使用内存映射的方法完成多个程序间的信息共享  end
使用内存映射的方法完成多个程序间的信息共享  
object GroupBox2: TGroupBox
使用内存映射的方法完成多个程序间的信息共享    Left 
= 0
使用内存映射的方法完成多个程序间的信息共享    Top 
= 121
使用内存映射的方法完成多个程序间的信息共享    Width 
= 319
使用内存映射的方法完成多个程序间的信息共享    Height 
= 121
使用内存映射的方法完成多个程序间的信息共享    Align 
= alTop
使用内存映射的方法完成多个程序间的信息共享    Caption 
= '共享内存的信息[接收]'
使用内存映射的方法完成多个程序间的信息共享    Enabled 
= False
使用内存映射的方法完成多个程序间的信息共享    TabOrder 
= 3
使用内存映射的方法完成多个程序间的信息共享    
object Label4: TLabel
使用内存映射的方法完成多个程序间的信息共享      Left 
= 16
使用内存映射的方法完成多个程序间的信息共享      Top 
= 24
使用内存映射的方法完成多个程序间的信息共享      Width 
= 26
使用内存映射的方法完成多个程序间的信息共享      Height 
= 13
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '数据'
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object Label5: TLabel
使用内存映射的方法完成多个程序间的信息共享      Left 
= 16
使用内存映射的方法完成多个程序间的信息共享      Top 
= 48
使用内存映射的方法完成多个程序间的信息共享      Width 
= 39
使用内存映射的方法完成多个程序间的信息共享      Height 
= 13
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '修改者'
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object Label6: TLabel
使用内存映射的方法完成多个程序间的信息共享      Left 
= 16
使用内存映射的方法完成多个程序间的信息共享      Top 
= 80
使用内存映射的方法完成多个程序间的信息共享      Width 
= 52
使用内存映射的方法完成多个程序间的信息共享      Height 
= 13
使用内存映射的方法完成多个程序间的信息共享      Caption 
= '修改时间'
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object edRData: TEdit
使用内存映射的方法完成多个程序间的信息共享      Left 
= 75
使用内存映射的方法完成多个程序间的信息共享      Top 
= 21
使用内存映射的方法完成多个程序间的信息共享      Width 
= 230
使用内存映射的方法完成多个程序间的信息共享      Height 
= 21
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 0
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object edRUser: TEdit
使用内存映射的方法完成多个程序间的信息共享      Left 
= 74
使用内存映射的方法完成多个程序间的信息共享      Top 
= 49
使用内存映射的方法完成多个程序间的信息共享      Width 
= 231
使用内存映射的方法完成多个程序间的信息共享      Height 
= 21
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 1
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享    
object edRTime: TEdit
使用内存映射的方法完成多个程序间的信息共享      Left 
= 74
使用内存映射的方法完成多个程序间的信息共享      Top 
= 73
使用内存映射的方法完成多个程序间的信息共享      Width 
= 231
使用内存映射的方法完成多个程序间的信息共享      Height 
= 21
使用内存映射的方法完成多个程序间的信息共享      Enabled 
= False
使用内存映射的方法完成多个程序间的信息共享      TabOrder 
= 2
使用内存映射的方法完成多个程序间的信息共享    end
使用内存映射的方法完成多个程序间的信息共享  end
使用内存映射的方法完成多个程序间的信息共享end

   程序的代码主要分为两部分,comm.pas单元中定义几个对操作内存映射的函数,以及共享内存的结构信息。代码如下:

使用内存映射的方法完成多个程序间的信息共享使用内存映射的方法完成多个程序间的信息共享...{
使用内存映射的方法完成多个程序间的信息共享      作者:           wudi_1982
使用内存映射的方法完成多个程序间的信息共享      联系方式:       [email protected]
使用内存映射的方法完成多个程序间的信息共享      开发工具以及平台:DELPHI7
+WINXP
使用内存映射的方法完成多个程序间的信息共享      转载请注明出处
使用内存映射的方法完成多个程序间的信息共享}

使用内存映射的方法完成多个程序间的信息共享unit comm;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享
interface
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享uses
使用内存映射的方法完成多个程序间的信息共享  Windows,SysUtils;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享
const
使用内存映射的方法完成多个程序间的信息共享  FILEMAPPINGNAME 
= 'MyFileMapping'// 指定内存映射的名字
使用内存映射的方法完成多个程序间的信息共享
  MUTEXNAME= 'MutexName'//互斥对象的名字
使用内存映射的方法完成多个程序间的信息共享

使用内存映射的方法完成多个程序间的信息共享type
使用内存映射的方法完成多个程序间的信息共享TShareMem 
= record //共享内存的结构信息
使用内存映射的方法完成多个程序间的信息共享
  Data       : array[0..255] of char;  //描述共享数据信息
使用内存映射的方法完成多个程序间的信息共享
  ModifyUser : array[0..255] of char;  //对数据的修改者
使用内存映射的方法完成多个程序间的信息共享
  ModifyTime : array[0..7] of char;    //数据最近一次的修改时间
使用内存映射的方法完成多个程序间的信息共享
end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享PShareMem 
= ^TShareMem;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享var
使用内存映射的方法完成多个程序间的信息共享  FileMapHandle : THandle;  
//建立映射的句柄
使用内存映射的方法完成多个程序间的信息共享
  MutexHandle : THandle;  // 互斥对象的句柄
使用内存映射的方法完成多个程序间的信息共享
  ShareMem : PShareMem;  //一个指向共享内存的指针
使用内存映射的方法完成多个程序间的信息共享

使用内存映射的方法完成多个程序间的信息共享 function OpenMap:THandle; 
//打开一个映射文件并映射到本进程中
使用内存映射的方法完成多个程序间的信息共享
 function CreateMap:THandle; //新建一个映射文件并映射到本进程中
使用内存映射的方法完成多个程序间的信息共享
 function LockMap:boolean;   //加锁
使用内存映射的方法完成多个程序间的信息共享
 procedure UnLockMap;        //解锁
使用内存映射的方法完成多个程序间的信息共享
 procedure CloseMap;         //关闭映射
使用内存映射的方法完成多个程序间的信息共享
 function ReadCommData:TShareMem;  //从共享信息中读取数据
使用内存映射的方法完成多个程序间的信息共享
 procedure WriteCommData(data,user,time : string);//对共享内存进行写操作
使用内存映射的方法完成多个程序间的信息共享

使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享implementation
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享function OpenMap:THandle;
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享  
//打开映射文件
使用内存映射的方法完成多个程序间的信息共享
  FileMapHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, //所有权限
使用内存映射的方法完成多个程序间的信息共享
              false,   //子进程不可继承
使用内存映射的方法完成多个程序间的信息共享
              FILEMAPPINGNAME
使用内存映射的方法完成多个程序间的信息共享  );
使用内存映射的方法完成多个程序间的信息共享  
if FileMapHandle <> 0 then  //如果映射文件打开成功
使用内存映射的方法完成多个程序间的信息共享
  begin
使用内存映射的方法完成多个程序间的信息共享     
//将映射文件映射到本进程
使用内存映射的方法完成多个程序间的信息共享
     ShareMem := pSharemem(MapViewOfFile(FileMapHandle,FILE_MAP_ALL_ACCESS,0,0,0));
使用内存映射的方法完成多个程序间的信息共享     
if ShareMem = nil then
使用内存映射的方法完成多个程序间的信息共享     begin
使用内存映射的方法完成多个程序间的信息共享       CloseHandle(FileMapHandle);
使用内存映射的方法完成多个程序间的信息共享       Result :
= 0;
使用内存映射的方法完成多个程序间的信息共享     end 
else begin
使用内存映射的方法完成多个程序间的信息共享       
//初始化共享区域
使用内存映射的方法完成多个程序间的信息共享
       FillChar(ShareMem^,sizeof(TSharemem),0);
使用内存映射的方法完成多个程序间的信息共享       Result :
= FileMapHandle;
使用内存映射的方法完成多个程序间的信息共享     end;
使用内存映射的方法完成多个程序间的信息共享  end 
else Result := 0;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享function CreateMap:THandle;
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享  FileMapHandle :
= CreateFileMapping($FFFFFFFF,//内存映射
使用内存映射的方法完成多个程序间的信息共享
  nil,
使用内存映射的方法完成多个程序间的信息共享  PAGE_READWRITE,
//读写操作
使用内存映射的方法完成多个程序间的信息共享
  0,//高32位 ,一般为0,除非要映射的文件大于4G
使用内存映射的方法完成多个程序间的信息共享
  sizeof(TShareMem),
使用内存映射的方法完成多个程序间的信息共享  FILEMAPPINGNAME
使用内存映射的方法完成多个程序间的信息共享  );
使用内存映射的方法完成多个程序间的信息共享  
if FileMapHandle <> 0 then
使用内存映射的方法完成多个程序间的信息共享  begin
使用内存映射的方法完成多个程序间的信息共享    ShareMem :
= pSharemem(MapViewOfFile(FileMapHandle,FILE_MAP_ALL_ACCESS,0,0,0));
使用内存映射的方法完成多个程序间的信息共享    
if ShareMem = nil then
使用内存映射的方法完成多个程序间的信息共享    begin
使用内存映射的方法完成多个程序间的信息共享      CloseHandle(FileMapHandle);
使用内存映射的方法完成多个程序间的信息共享      Result :
= 0;
使用内存映射的方法完成多个程序间的信息共享    end 
else Result := FileMapHandle;
使用内存映射的方法完成多个程序间的信息共享  end 
else Result := 0;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享function LockMap:boolean;
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享   
//创建一个互斥对象并加锁
使用内存映射的方法完成多个程序间的信息共享
   MutexHandle := CreateMutex(nil,false,MUTEXNAME);
使用内存映射的方法完成多个程序间的信息共享   
if MutexHandle <> 0 then
使用内存映射的方法完成多个程序间的信息共享   begin
使用内存映射的方法完成多个程序间的信息共享     
if WaitForSingleObject(MutexHandle,1000)= WAIT_FAILED then Result := false
使用内存映射的方法完成多个程序间的信息共享     
else Result := true;
使用内存映射的方法完成多个程序间的信息共享   end 
else Result := false;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure UnLockMap;
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享  
//释放资源
使用内存映射的方法完成多个程序间的信息共享
  if MutexHandle <> 0 then
使用内存映射的方法完成多个程序间的信息共享  begin
使用内存映射的方法完成多个程序间的信息共享     ReleaseMutex(MutexHandle);
使用内存映射的方法完成多个程序间的信息共享     CloseHandle(MutexHandle);
使用内存映射的方法完成多个程序间的信息共享  end;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure CloseMap;
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享   
// 关闭映射并释放资源
使用内存映射的方法完成多个程序间的信息共享
   if ShareMem <> nil then UnmapViewOfFile(ShareMem);
使用内存映射的方法完成多个程序间的信息共享   
if FileMapHandle <> 0 then CloseHandle(FileMapHandle);
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享function ReadCommData:TShareMem;
使用内存映射的方法完成多个程序间的信息共享var
使用内存映射的方法完成多个程序间的信息共享  tm : TShareMem;
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享  with tm 
do
使用内存映射的方法完成多个程序间的信息共享  begin
使用内存映射的方法完成多个程序间的信息共享    Data :
= ShareMem^.Data;
使用内存映射的方法完成多个程序间的信息共享    ModifyUser :
= ShareMem^.ModifyUser;
使用内存映射的方法完成多个程序间的信息共享    ModifyTime :
= ShareMem^.ModifyTime;
使用内存映射的方法完成多个程序间的信息共享  end;
使用内存映射的方法完成多个程序间的信息共享  Result :
= tm;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure WriteCommData(data,user,time : 
string);
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享   StrCopy(ShareMem
^.Data,pchar(data));
使用内存映射的方法完成多个程序间的信息共享   StrCopy(ShareMem
^.ModifyUser,pchar(user));
使用内存映射的方法完成多个程序间的信息共享   StrCopy(ShareMem
^.ModifyTime,pchar(time));
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享end.


 代码的另一个部分就是根据需要调用这些函数的FirstTest.pas,即上面窗体单元对应的代码

 

使用内存映射的方法完成多个程序间的信息共享使用内存映射的方法完成多个程序间的信息共享...{
使用内存映射的方法完成多个程序间的信息共享      作者:           wudi_1982
使用内存映射的方法完成多个程序间的信息共享      联系方式:       [email protected]
使用内存映射的方法完成多个程序间的信息共享      开发工具以及平台:DELPHI7
+WINXP
使用内存映射的方法完成多个程序间的信息共享      转载请注明出处
使用内存映射的方法完成多个程序间的信息共享}

使用内存映射的方法完成多个程序间的信息共享unit FirstTest;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享
interface
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享uses
使用内存映射的方法完成多个程序间的信息共享  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
使用内存映射的方法完成多个程序间的信息共享  Dialogs, StdCtrls, ComCtrls, ExtCtrls;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享
const
使用内存映射的方法完成多个程序间的信息共享  WM_MYMESSAGE
=WM_USER+1024//一个自定义消息,用来通知接受程序数据到达
使用内存映射的方法完成多个程序间的信息共享

使用内存映射的方法完成多个程序间的信息共享type
使用内存映射的方法完成多个程序间的信息共享  TForm1 
= class(TForm)
使用内存映射的方法完成多个程序间的信息共享    GroupBox1: TGroupBox;
使用内存映射的方法完成多个程序间的信息共享    Label1: TLabel;
使用内存映射的方法完成多个程序间的信息共享    Label2: TLabel;
使用内存映射的方法完成多个程序间的信息共享    Label3: TLabel;
使用内存映射的方法完成多个程序间的信息共享    edData: TEdit;
使用内存映射的方法完成多个程序间的信息共享    edModifyUser: TEdit;
使用内存映射的方法完成多个程序间的信息共享    edModifyTime: TEdit;
使用内存映射的方法完成多个程序间的信息共享    Panel1: TPanel;
使用内存映射的方法完成多个程序间的信息共享    btnCreate: TButton;
使用内存映射的方法完成多个程序间的信息共享    btnOpen: TButton;
使用内存映射的方法完成多个程序间的信息共享    btnRead: TButton;
使用内存映射的方法完成多个程序间的信息共享    btnSet: TButton;
使用内存映射的方法完成多个程序间的信息共享    btnClose: TButton;
使用内存映射的方法完成多个程序间的信息共享    btnClear: TButton;
使用内存映射的方法完成多个程序间的信息共享    StatusBar1: TStatusBar;
使用内存映射的方法完成多个程序间的信息共享    GroupBox2: TGroupBox;
使用内存映射的方法完成多个程序间的信息共享    Label4: TLabel;
使用内存映射的方法完成多个程序间的信息共享    Label5: TLabel;
使用内存映射的方法完成多个程序间的信息共享    Label6: TLabel;
使用内存映射的方法完成多个程序间的信息共享    edRData: TEdit;
使用内存映射的方法完成多个程序间的信息共享    edRUser: TEdit;
使用内存映射的方法完成多个程序间的信息共享    edRTime: TEdit;
使用内存映射的方法完成多个程序间的信息共享    procedure btnCreateClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享    procedure btnOpenClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享    procedure btnSetClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享    procedure btnCloseClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享    procedure btnReadClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享    procedure FormClose(Sender: TObject; var Action: TCloseAction);
使用内存映射的方法完成多个程序间的信息共享    procedure btnClearClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享    procedure FormCreate(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享  
private
使用内存映射的方法完成多个程序间的信息共享    atm : TAtom; 
//一个原子
使用内存映射的方法完成多个程序间的信息共享
    nextwindow : string//被发送消息程序的标题信息
使用内存映射的方法完成多个程序间的信息共享
    procedure MyMessage(var msg : TMessage);message WM_MYMESSAGE; //自定义消息的处理
使用内存映射的方法完成多个程序间的信息共享
  public
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享  end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享var
使用内存映射的方法完成多个程序间的信息共享  Form1: TForm1;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享implementation
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享uses comm;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享使用内存映射的方法完成多个程序间的信息共享
...{$R *.dfm}
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure TForm1.btnCreateClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享  
if CreateMap = 0 then
使用内存映射的方法完成多个程序间的信息共享    ShowMessage(
'内存映射建立失败')
使用内存映射的方法完成多个程序间的信息共享  
else begin
使用内存映射的方法完成多个程序间的信息共享    btnCreate.Enabled :
= false;
使用内存映射的方法完成多个程序间的信息共享    btnOpen.Enabled :
= false;
使用内存映射的方法完成多个程序间的信息共享    StatusBar1.Panels[
0].Text := '内存映射文件新建立完毕'
使用内存映射的方法完成多个程序间的信息共享  end;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure TForm1.btnOpenClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享   
if OpenMap = 0 then
使用内存映射的方法完成多个程序间的信息共享     ShowMessage(
'内存映射打开失败')
使用内存映射的方法完成多个程序间的信息共享   
else begin
使用内存映射的方法完成多个程序间的信息共享     btnCreate.Enabled :
= false;
使用内存映射的方法完成多个程序间的信息共享     btnOpen.Enabled :
= false;
使用内存映射的方法完成多个程序间的信息共享     StatusBar1.Panels[
0].Text := '内存映射文件打开完毕'
使用内存映射的方法完成多个程序间的信息共享   end;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure TForm1.btnSetClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享var
使用内存映射的方法完成多个程序间的信息共享  hd : THandle;
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享   
if (edData.Text = '') or (edModifyUser.Text = '') then
使用内存映射的方法完成多个程序间的信息共享      ShowMessage(
'请填写完整信息')
使用内存映射的方法完成多个程序间的信息共享   
else begin
使用内存映射的方法完成多个程序间的信息共享     edModifyTime.Text :
= FormatDateTime('mm:hh:mm',Now);
使用内存映射的方法完成多个程序间的信息共享     WriteCommData(edData.Text,edModifyUser.Text,edModifyTime.Text);
使用内存映射的方法完成多个程序间的信息共享    
//查找此程序的另外一个实例,如果找到,发送数据到达的消息
使用内存映射的方法完成多个程序间的信息共享
     hd := FindWindow(nil,pchar(nextwindow));
使用内存映射的方法完成多个程序间的信息共享     
if hd <> 0 then
使用内存映射的方法完成多个程序间的信息共享       SendMessage(hd,WM_MYMESSAGE,
1,0);
使用内存映射的方法完成多个程序间的信息共享   end;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure TForm1.btnCloseClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享  UnLockMap;
使用内存映射的方法完成多个程序间的信息共享  CloseMap;
使用内存映射的方法完成多个程序间的信息共享  btnCreate.Enabled :
= true;
使用内存映射的方法完成多个程序间的信息共享  btnOpen.Enabled :
= true;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure TForm1.btnReadClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享var
使用内存映射的方法完成多个程序间的信息共享  tm : TShareMem;
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享   tm :
= ReadCommData;
使用内存映射的方法完成多个程序间的信息共享   edRData.Text :
= tm.Data;
使用内存映射的方法完成多个程序间的信息共享   edRUser.Text :
= tm.ModifyUser;
使用内存映射的方法完成多个程序间的信息共享   edrTime.Text :
= tm.ModifyTime;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享  UnLockMap;
使用内存映射的方法完成多个程序间的信息共享  CloseMap;
使用内存映射的方法完成多个程序间的信息共享  
//下面这一句非常重要,如果不及时删除原子表中添加的原子,
使用内存映射的方法完成多个程序间的信息共享  
//怕是只有重启计算机才能干掉程序启动时添加到原子表中的信息了
使用内存映射的方法完成多个程序间的信息共享
  GlobalDeleteAtom(atm);
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure TForm1.btnClearClick(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享   edData.Text :
= '';
使用内存映射的方法完成多个程序间的信息共享   edModifyUser.Text :
= '';
使用内存映射的方法完成多个程序间的信息共享   edModifyTime.Text :
= '';
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure TForm1.MyMessage(var msg: TMessage);
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享  
if msg.WParam = 1 then
使用内存映射的方法完成多个程序间的信息共享  begin
使用内存映射的方法完成多个程序间的信息共享    Application.BringToFront;
使用内存映射的方法完成多个程序间的信息共享    StatusBar1.Panels[
0].Text := '新数据到代';
使用内存映射的方法完成多个程序间的信息共享    btnReadClick(nil);
使用内存映射的方法完成多个程序间的信息共享  end;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享procedure TForm1.FormCreate(Sender: TObject);
使用内存映射的方法完成多个程序间的信息共享begin
使用内存映射的方法完成多个程序间的信息共享   
//下面的代码将在程序启动时执行,主要是通过原子表检查此程序是否运行,
使用内存映射的方法完成多个程序间的信息共享   
//本程序运行运行两个实例,一个用来建立映射文件,
使用内存映射的方法完成多个程序间的信息共享   
//一个用来打开映射文件,你完全可以用两个不同的程序来处理,这里为了方便
使用内存映射的方法完成多个程序间的信息共享   
//以及演示原子表的使用而采用一个程序执行两次的方法来做
使用内存映射的方法完成多个程序间的信息共享
   if GlobalFindAtom(pchar('wudi_1982')) <> 0 then//查找原子表如果第一个窗体已经存在
使用内存映射的方法完成多个程序间的信息共享
   begin
使用内存映射的方法完成多个程序间的信息共享      
if GlobalFindAtom(pchar('jingyang')) <> 0 then//如果第二个窗体也存在
使用内存映射的方法完成多个程序间的信息共享
      begin
使用内存映射的方法完成多个程序间的信息共享        Application.Terminate;
使用内存映射的方法完成多个程序间的信息共享      end 
else begin
使用内存映射的方法完成多个程序间的信息共享        
//添加原子到原子表,以记录此程序的第二个实例已经运行,并做相应操作
使用内存映射的方法完成多个程序间的信息共享
        atm := GlobalAddAtom(pchar('jingyang'));
使用内存映射的方法完成多个程序间的信息共享        Application.Title :
= 'MyMapForm_2';
使用内存映射的方法完成多个程序间的信息共享        Form1.Caption :
= 'MyMapForm_2';
使用内存映射的方法完成多个程序间的信息共享        nextwindow :
= 'MyMapForm_1';
使用内存映射的方法完成多个程序间的信息共享      end;
使用内存映射的方法完成多个程序间的信息共享   end 
else begin
使用内存映射的方法完成多个程序间的信息共享     
//添加原子到原子表,以记录此程序的第一个实例已经运行,并做相应操作
使用内存映射的方法完成多个程序间的信息共享
     atm := GlobalAddAtom(pchar('wudi_1982'));
使用内存映射的方法完成多个程序间的信息共享     Application.Title :
= 'MyMapForm_1';
使用内存映射的方法完成多个程序间的信息共享     Form1.Caption :
= 'MyMapForm_1';
使用内存映射的方法完成多个程序间的信息共享     nextwindow :
= 'MyMapForm_2';
使用内存映射的方法完成多个程序间的信息共享   end;
使用内存映射的方法完成多个程序间的信息共享end;
使用内存映射的方法完成多个程序间的信息共享
使用内存映射的方法完成多个程序间的信息共享end.

程序运行效果图:

使用内存映射的方法完成多个程序间的信息共享

例程的使用方法:

        编译之后,运行此程序的两个实例,在其中一个实例中,点击按钮【新建内存映射】,另一个实例使用【打开已存在的映射】,然后在窗体的发送部分,填写相应信息,然后点击【设计内存信息】,就可以看到效果了。

       注:WINXP+D7;

       转载请注明出处