zoukankan      html  css  js  c++  java
  • 进程间通信——内存映射

    进程1的数据有时需要发送给进程B,这可以通过内存映射实现。

    主要用到的函数:

    1.首先在一个进程里用CreateFileMapping创建一个新的文件映射内核对象。

    HANDLE CreateFileMapping(
                                                       HANDLE hFile,         //物理文件句柄,一般将它设置成为 0xFFFFFFFF(INVALID_HANDLE_VALUE)创建一个物理文件无关的内存映射就可以了
                                                       LPSECURITY_ATTRIBUTES lpAttributes,                            //安全设置,一般设置NULL使用默认的安全配置
                                                       DWORD flProtect,                              //保护设置,下述常数之一:PAGE_READONLY 以只读方式打开映射,PAGE_READWRITE 以可读、可

    //写方式打开映射,PAGE_WRITECOPY 为写操作留下备份
                                                       DWORD dwMaximumSizeHigh,          //文件映射的最大长度的高32位,一般设为0,用低32位一般就够用了
                                                       DWORD dwMaximumSizeLow,           //文件映射的最大长度的低32位
                                                       LPCTSTR lpName                               //共享内存名称,其他进程可用这个名字来访问这个文件映像
                                                    );

    函数调用成功就返回一个句柄,后面会继续用到。

    2.在该进程将文件映射到一个进程的地址空间上

    LPVOID WINAPI MapViewOfFile(
                                                               __in HANDLE hFileMappingObject,         //CreateFileMapping()返回的文件映像对象句柄
                                                               __in DWORD dwDesiredAccess,              //与CreateFileMapping()函数所设置的保护属性相匹配
                                                               __in DWORD dwFileOffsetHigh,                //文件映射起始偏移的高32位
                                                               __in DWORD dwFileOffsetLow,                 //文件映射起始偏移的低32位
                                                               __in SIZE_T dwNumberOfBytesToMap     //指定映射文件的字节数
                                                             );

    3.在另一个进程里用OpenFileMapping打开已经创建的文件映像


    例子:

    进程1中创建映像,并发送数据

    <span style="font-size:18px;">//创建文件映像对象
    	HANDLE hMapping;   
    	LPSTR StrData;   
    	hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,"COMMUNICATION");   
    	if(hMapping==NULL)   
    	{   
    		MessageBox("创建文件映像对象失败","信息提示",MB_OK);
    		return;
    	}
    	//将文件映射到一个进程的地址空间上
    	StrData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);   
    	if(StrData==NULL)   
    	{   
    		AfxMessageBox("MapViewOfFile() failed.");
    		MessageBox("文件映射失败","信息提示",MB_OK);
    		return;
    	}
    	//向映射内存写数据
    	sprintf(StrData,m_StrSendData);   	
    	//释放映像内存
    	UnmapViewOfFile(StrData);</span>


    进程2里接收数据

    <span style="font-size:18px;">//创建文件映像对象
    HANDLE hMapping;   
    LPSTR StrData;   
    /*hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,"COMMUNICATION");   
    if(hMapping==NULL)   
    {   
    MessageBox("创建文件映像对象","信息提示",MB_OK);
    return;
    }
    //将文件映射到一个进程的地址空间上
    StrData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);   */
    hMapping=OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _T("COMMUNICATION"));
    if (hMapping == NULL)
    {
    MessageBox("打开文件映像对象失败", "信息提示", MB_OK);
    return;
    }
    StrData = (LPSTR)MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    if(StrData==NULL)   
    {   
    AfxMessageBox("MapViewOfFile() failed.");
    MessageBox("文件映射失败","信息提示",MB_OK);
    return;
    }
    //获取映像内存的数据量
    m_StrReceiveData.Format("%s", StrData);
    //释放映像内存
    UnmapViewOfFile(StrData);</span>

    使用完记得释放映像内存。

    版权声明:

  • 相关阅读:
    一个int类型究竟占多少个字节
    TCMalloc 安装与使用
    [创意标题] spoj 11354 Amusing numbers
    如何更好地理解和使用Github
    一天JavaScript示例-点击图片显示大图片添加鼠标
    php方法综述除去换行符(PHP_EOL使用变量)
    使用jQuery和css3实现了仿淘宝ued博客左边的菜单切换动画
    【软件使用技巧】PL/SQL Developer实现双击table询
    newlisp 接受jenkins带空格的参数
    Oracle listener lsnrctl
  • 原文地址:https://www.cnblogs.com/walccott/p/4957107.html
Copyright © 2011-2022 走看看