内存映射

来源:互联网 发布:ubuntu caffe 教程 编辑:程序博客网 时间:2024/05/22 01:52

首先,进程A 创建一个命名内存映射对象

其次,进程B 通过名称来访问进程A创建的内存映射对象

上面操作都成功后就可以进行通信,通信的同步处理可以用命名的事件、信号量等内核对象来实现

 

    //创建内存映射对象    static HANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE                                                , NULL                                                , PAGE_READWRITE|SEC_COMMIT                                                , 0,sizeof(DWORD)                                                ,L"FileMapLink");    if (NULL == hFileMap)    {        switch(GetLastError())        {        case ERROR_FILE_INVALID:            TRACE("CreateFileMapping Error:企图创建一个零长度的文件映射\r\n");            break;        case ERROR_INVALID_HANDLE:            TRACE("CreateFileMapping Error:ERROR_INVALID_HANDLE\r\n");            break;        case ERROR_ALREADY_EXISTS:            TRACE("CreateFileMapping Error:已有一个同名内存映射存在.\r\n");            break;        }        return;    }    //访问内存映射对象    static VOID* pViewMap = MapViewOfFile( hFileMap                                            , FILE_MAP_WRITE //访问方式                                            , 0, 0, 0);    if (NULL == pViewMap)    {        TRACE("MapViewOfFile Error:访问内存映射对象失败.\r\n");        return;    }    //向映射内存写入数据    *((DWORD*)pViewMap) = GetCurrentProcessId();    //创建一个通知事件    static HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, L"EventLink");    if (NULL == hEvent)    {        TRACE("CreateEvent Error:创建失败.\r\n");        return;    }        //通知对方,内存中已有数据,可以进行读取    SetEvent(hEvent);     //不使用是,释放资源    UnmapViewOfFile(pViewMap);    CloseHandle(hFileMap);    CloseHandle(hEvent);


下面展示,进程B如何来访问进程A的数据

   

    static HANDLE hFileMap = OpenFileMapping(FILE_MAP_READ, FALSE, L"FileMapLink");    if (NULL == hFileMap)    {        TRACE("OpenFileMapping Error:打开内存映射对象失败.\r\n");    }    else    {        static HANDLE hEvent = OpenEvent(SYNCHRONIZE, FALSE, L"EventLink");        if (NULL == hEvent)        {            TRACE("OpenEvent Error:访问事件失败.\r\n");        }        else        {            if (WAIT_OBJECT_0 == WaitForSingleObject(hEvent, 5000))            {                static void* pBuf = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);                if (pBuf)                {                    DWORD   dwCurrProcessID = *((DWORD*)pBuf);                    TRACE("CMockShim>> OXProvider ProcessID =  %d", dwCurrProcessID);                    //LOGON_INFO* pstLogonInfo = (LOGON_INFO*)pBuf;                    //TRACE("pstLogonInfo->szUserName = %s\r\n", pstLogonInfo->szUserName);                    //TRACE("pstLogonInfo->szUserPwd = %s\r\n", pstLogonInfo->szUserPwd);                }                UnmapViewOfFile(pBuf);            }        }    }
    CloseHandle(hFileMap);
    CloseHandle(hEvent);


 

原创粉丝点击