C++Builder实现内存映射

c++builder 专栏收录该内容
3 篇文章 0 订阅

这里内存映射发送端(以后简称:发送端)负责写入数据到共享内存中,内存映射接收端(以后简称:接收端)负责显示写入的数据;

当然也可以打开多个内存映射发送端(这里也可以通过读出按钮显示写入到共享内存的数据);


输入信息,并单击写入


接收端显示写入信息,这里可以修改接收端信息,在发送端读出


发送端代码:

定义共享内存中的数据结构:

struct shareMem {
HWND hWnd;
        char text[255];
} *shMem;

这里通过消息机制通知接收端获取共享内存中的数据,所以还要定义信号量:

#define WM_DATA WM_USER+2000

窗口生成时创建映像文件(或者打开)并映射到本进程中

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    fMap = OpenFileMapping(FILE_MAP_WRITE, NULL, LPCTSTR("FileMapping"));//内存映射文件名为FileMapping
    if(!fMap){//内存映射文件不存在
        fMap=CreateFileMapping((void *)0xFFFFFFFF, NULL, PAGE_READWRITE, 0,sizeof(shareMem), LPCTSTR("FileMapping"));
        ShowMessage("创建内存映射文件");
    }
    else{
        ShowMessage("打开内存映射文件");
    }
    if(fMap){//内存映射文件存在
        (void *)shMem = MapViewOfFile(fMap,FILE_MAP_ALL_ACCESS,0,0,0);//将映像文件映射到进程地址空间
    }        
}

窗口关闭时撤销进程中的内存映射文件,再关闭映像文件

    if(fMap){//内存映射文件存在
        UnmapViewOfFile(shMem);//从进程中撤销映像文件
        CloseHandle(fMap);//关闭映像文件
    }

还需要通知接收端显示共享内存的数据

    if(Edit1->Text.Length() != 0){//Edit1->Text不为空时写入
        strcpy(shMem->text, Edit1->Text.c_str());//将 Edit1->Text写入到 shMem->text
    }
    strcpy(shMem->text, Edit1->Text.c_str());
    Edit1->Text = "";


    HWND hWnd = FindWindow(NULL,"内存映射接收端");
    if(hWnd) {
        ShowMessage("找到窗口:内存映射接收端");
        PostMessage(hWnd,WM_DATA,0,0);
    }
    else{
        ShowMessage("没找到窗口:内存映射接收端");
    }


接收端代码:

同样,需要定义信号量和共享内存数据:

#define WM_DATA WM_USER+2000
struct shareMem {
HWND hWnd;
        char text[255];
} *shMem;


还需要通过消息映射实现通信:

 void __fastcall receiveMessage(TMessage &Msg);
        
BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_DATA,TMessage,receiveMessage);
END_MESSAGE_MAP(TForm);


void __fastcall TForm2::receiveMessage(TMessage &Msg){
    Edit1->Text = shMem->text;
}


同样,窗口创建时打开共享内存并写入到进程中,窗口关闭时关闭内存映射文件。

源码下载地址:http://pan.baidu.com/s/1pJAbSH9

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

上篇 C++ Builder入门 第一章 C++ Builder 5的集成开发环境 1.1 概述 1.1.1 C++ Builder 5的主要特点 1.1.2 C++ Builder 5的新增功能 1.1.3 C++ Builder 5的安装与运行 1.2 C++ Builder 5的集成开发环境 1.2.1 窗体 1.2.2 菜单栏 1.2.3 加速栏 1.2.4 控件栏 1.2.5 对象观察器 1.2.6 工程管理器 1.2.7 代码编辑器 1.2.8 类浏览器 1.2.9 桌面工具栏 1.3 C++ Builder的编程方法和步骤 1.3.1 开始一个新的工程 1.3.2 设计用户界面 1.3.3 属性的设置 1.3.4 编写程序代码 1.3.5 编译、运行程序 1.4 程序的调试 1.4.1 程序错误的种类 1.4.2 C++ Builder集成环境中的调试选项 1.4.3 C++ Builder的主要调试手段 1.4.4 C++ Builder的辅助调试工具 1.5 使用联机帮助 1.6 小结 第二章 窗体 2.1 窗体的属性、事件和方法 2.1.1 窗体的主要属性 2.1.2 窗体的主要事件 2.1.3 窗体的方法 2.2 设置窗体环境 2.3 窗体模板 2.3.1 使用窗体模板 2.3.2 向窗体模板库中加入新的窗体模板 2.4 菜单设计 2.5 菜单项的主要属性和方法 2.6 菜单模板 2.7 工具栏设计 2.8 状态栏设计 2.9 综合实例 2.10 小结 第三章 常用控件编程 3.1 进度条控件(ProgressBar) 3.1.1 进度条捷件的属性 3.1.2 进度条控件的入法 3.2 动画控件(Animate) 3.2.1 动画控件的属性 3.2.2 动画控件的主要方法 3.3 列表框控件(ListBox) 3.3.1 列表框控件的属性 3.3.2 列表框的主要方法 3.4 组合框控件(ComboBox) 3.4.1 组合框拧件的属性 3.4.2 组合框控件的方法 3.5 列表视图控件的属性(ListView) 3.6 树形视图控件(TreeView) 3.7 文件系统控件 3.7.1 文件列表框控件(FileList) 3.7.2 驱动器组合框控件(DriveComboBox) 3.7.3 过滤器组合框控件(FilterComboBox) 3.7.4 目录列表框控件(DirectoryListBox) 3.8 公用对话枢控件 3.8.1 OpenDialog的主要属性 3.8.2 OpenDialog的方法——Execute方法 3.9 文本编辑校件(RichEdit) 3.9.1 文本编辑控件的主要属性 3.9.2 文本编辑校件的方法 3.10 小结 第四章 消息及异常 4.1 Windows消息和C++ Builder事件 4.2 消息映射 4.3 自定义消息 4.3.1 定义自己的消息 4.3.2 定义消息处理旬柄 4.3.3 发送和传递消息 4.4 异常处理 4.5 try/catch块 4.6 异常类 4.7 替代缺省的异常处理 4.8 小结 中篇 C++ Builder进阶 第五章 图形和图像 5.1 图形功能 5.1.1 画布(Canvas)的属性 5.1.2 画布对象的常用方法 5.2 图像功能 5.2.1 TGraphic类 5.2.2 TPicture类 5.2.3 TImage组件及其应用 5.2.4 TShape组件 5.3 图形和图像的综合 5.3.1 组件设计 5.3.2 代码设计 5.4 小结 第六章 多媒体 6.1 多媒体与MCI Media Player 6.2 用MediaPlayer控件进行编程 6.2.1 MediaPlayer的主要属性及事件 6.2.2 使用MediaPlayer控件 6.3 运用MCI API进行多媒体开发 6.3.1 PlaySound函数 6.3.2 mciSendString 6.3.3 mciSendCommand 6.4 ActiveMovie控件 6.4.1 ActiveMovie控件的主要属性 6.4.2 ActvieMovie的主要方法 6.4.3 ActiveMovie的主要事件 6.5 小结 第七章 OpenGL和DirectDraw 7.1 OpenGL 7.2 DirectDraw 7.2.1 DirectX 7.2.2 DirectDraw的概述 7.3 DirectDraw、OLE和COM接口 7.3.1 DirectDraw对象和IDirectDraw接口 7.3.2 DirectDrawClipper对象和IDirectDrawClipper接口 7.3.3 DirectDraw
参与评论
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏作者

守望者OR

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值