曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4615|回复: 0
打印 上一主题 下一主题

通过映射文件共享数据

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-2-21 16:16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过映射文件共享数据是进程间通讯的常用方法之一。因为 Mapping 对象在系统中是全局的,一个进程创建的映射对象可以从另一个进程中打开,此时映射视图就是进程间的共享内存。

下面有 2 个程序,程序一创建一个 Mapping 对象,并在对象的视图中写入需要共享的数据,然后等待别的进程(程序二)从 Mapping 对象中读取。

程序一
[C++] 纯文本查看 复制代码
#include "stdafx.h"
#include <conio.h>

#define BUFSIZE    256

LPTSTR szName = TEXT("SharedFileMappingObject");

LPTSTR szMsg = _T("来自进程1的消息!");

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (LC_ALL, "chs");

    HANDLE hMapFile;        // 文件映射句柄

    LPTSTR    pBuf;            // 共享数据缓冲区指针

    hMapFile = CreateFileMapping (INVALID_HANDLE_VALUE,        // 与物理文件无关
                                  NULL,                        // 安全设置默认
                                  PAGE_READWRITE,            // 保护设置
                                  0,                        // 高 32 位
                                  BUFSIZE,                    // 低 32 位
                                  szName);                    // 共享内存名

    if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE) {
        printf ("CreateFileMapping error: %d\n", GetLastError());
        return (-1);
    }

    //创建视图
    pBuf = (LPTSTR) MapViewOfFile (hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUFSIZE);
    if (pBuf == NULL) {
        printf ("MapViewOfFile error %d\n", GetLastError());
        return (-2);
    }

    //将共享数据复制到文件映射中
    CopyMemory(pBuf, szMsg, 2*_tcslen(szMsg));
     
    _tprintf (TEXT("请运行程序2,完成后,按任意键退出该程序..."));

    _getch();

    //取消映射
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);

    return 0;
}

在运行程序二前不要让程序一退出,当程序二运行完毕后,会看到下面的对话框:


程序二代码:
[C++] 纯文本查看 复制代码
#include "stdafx.h"

#pragma comment (lib, "User32.lib")        //将 User32.lib 库文件加到本工程

#define BUF_SIZE    256

TCHAR szName[] = TEXT("SharedFileMappingObject");

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (LC_ALL, "chs");

    HANDLE hMapFile;
    LPTSTR pBuf;

    // 打开文件 Mapping 
    hMapFile = OpenFileMapping (FILE_MAP_ALL_ACCESS, FALSE, szName);
    if (hMapFile == NULL) {
        printf ("OpenFileMapping error: %d\n", GetLastError());
        return (-1);
    }

    pBuf = (LPTSTR)MapViewOfFile (hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);

    if (pBuf == NULL) {
        printf ("MapViewOfFile error %d\n", GetLastError());
        return (-2);
    }

    MessageBox (NULL, pBuf, TEXT("进程2"), MB_OK);

    UnmapViewOfFile(pBuf);

    CloseHandle(hMapFile);

    return 0;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 00:50 , Processed in 0.078551 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表