• 进程间通信——内存映射


    进程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>

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

    版权声明:

  • 相关阅读:
    POJ-2955 Brackets(括号匹配问题)
    NYOJ
    石子合并问题
    hdu 4915 括号匹配+巧模拟
    hdu 4920
    hdu 4911 求逆序对数+树状数组
    hdu 4923 单调栈
    hdu 4930 斗地主恶心模拟
    hdu 4927 组合+公式
    hdu 4925 黑白格
  • 原文地址:https://www.cnblogs.com/walccott/p/4957107.html
Copyright © 2020-2023  润新知