• 进程共享数据


    程序A中共享数据, 代码:

    // 内存共享数据A.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "内存共享数据A.h"
    #include<vector>
    using namespace std;
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // The one and only application object
    
    CWinApp theApp;
    
    
    #define MEM_SIZE 0x1000000
    #define MEM_SHARE_NAME TEXT("demo")
    
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
        //创建或获取内存文件句柄
        HANDLE hFile = CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,MEM_SIZE,MEM_SHARE_NAME);
        VOID * pMem = NULL;
        if(hFile != NULL)
        {
            //获取存储的内存地址
            pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);
            //设置数据
            vector<int> a;
            for (int i=0; i<10; i++)
                a.push_back(i+1);
            memcpy(pMem, &a[0], a.size()*sizeof(int));
        }
    
        while (1)
        {
            Sleep(1000);
        }
    
        //如果不再使用,应该关闭句柄
        //CloseHandle(hFile);
    
        return 0;
    }

    程序B中使用数据, 代码:

    // 内存共享数据A.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "共享内存数据B.h"
    #include<vector>
    using namespace std;
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // The one and only application object
    
    CWinApp theApp;
    
    
    #define MEM_SIZE 0x1000000
    #define MEM_SHARE_NAME TEXT("demo")
    
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
        //创建或获取内存文件句柄
        HANDLE hFile = CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,MEM_SIZE,MEM_SHARE_NAME);
        VOID * pMem = NULL;
        if(hFile != NULL)
        {
            //获取存储的内存地址
            pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);
            //读取数据
            vector<int> a(10);
            memcpy(&a[0],pMem,a.size()*sizeof(int));
            for (int i=0; i<10; i++)
                cout<<a[i]<<endl;
        }
    
        //如果不再使用,应该关闭句柄
        //CloseHandle(hFile);
    
        return 0;
    }

     函数说明:

    HANDLE CreateFileMapping(HANDLE hFile,
    LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
    DWORD flProtect,
    DWORD dwMaximumSizeHigh,
    DWORD dwMaximumSizeLow,
    LPCTSTR lpName);

    参数hFile指定了待映射到进程地址空间的文件句柄,如果为无效句柄INVALID_HANDLE_VALUE则系统会创建一个使用来自页文件而非指定磁盘文件存储器的文件映射对象;

    flProtect设定了系统对页面采取的保护属性,由于需要进行读写操作,因此可以设置保护属性PAGE_READWRITE;

    dwMaximumSizeHighdwMaximumSizeLow指定了所开辟共享内存区的最大字节数;

    lpName用来给此共享内存设定一个名字,接收程序可以通过这个名字将其打开。

    LPVOID MapViewOfFile(HANDLE hFileMappingObject,
    DWORD dwDesiredAccess,
    DWORD dwFileOffsetHigh,
    DWORD dwFileOffsetLow,
    DWORD dwNumberOfBytesToMap);

    参数hFileMappingObject为CreateFileMapping()返回的内存文件映像对象句柄;

    参数dwDesiredAccess再次指定对其数据的访问方式,而且需要同CreateFileMapping()函数所设置的保护属性相匹配。

    也可以写简单一些:

    A程序代码:

    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
        //创建内存文件句柄
        HANDLE hFile = CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0, 0x1000000, "mySharedMem");
        //获取存储的内存地址
        VOID * pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);
    
        int* p = (int*)pMem;
        p[0] = 1;
        p[1] = 2;
    
        while (1)
        {
            Sleep(1000);
        }
    
        //如果不再使用,应该关闭句柄
        CloseHandle(hFile);
    
        return 0;
    }

    B程序代码:

    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
        //获取内存文件句柄
        HANDLE hFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "mySharedMem");
        VOID * pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);
    
        int* p = (int*)pMem;
        cout<<p[0]<<endl
            <<p[1]<<endl;
    
        return 0;
    }

    OpenFileMapping中第一个参数是权限, FILE_MAP_ALL_ACCESS与FILE_MAP_WRITE相同; 第二个参数如果为TRUE,可以继承进程句柄,一半设为FALSE; 第三个参数是打开的mapping对象的名字.

  • 相关阅读:
    微软官方原版Windows Server 2003 R2下载
    [转]Windows Server 2003/2008 官方VHD转换为VMWARE的VMDK
    [转]Windows Server 2003/2008 原版ISO下载地址
    [转]免重启修改Windows远程桌面3389端口脚本
    [转]VMware 虚拟机硬盘镜像共享(98、ME、2000、2003)
    鹦鹉的性格
    [转]关于工作与生活的转帖
    GB2312 字符串,单字节英文,双字节中文的完整类实现
    越狱第2季14集已经出来了!!
    测试一下Windows live Writer,顺便怀念一下单位以前的几个猫咪。
  • 原文地址:https://www.cnblogs.com/saieuler/p/3153864.html
Copyright © 2020-2023  润新知