C++Builder实现内存映射

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

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


输入信息,并单击写入


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


发送端代码:

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

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
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

守望者OR

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

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

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

打赏作者

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

抵扣说明:

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

余额充值