这里内存映射发送端(以后简称:发送端)负责写入数据到共享内存中,内存映射接收端(以后简称:接收端)负责显示写入的数据;
当然也可以打开多个内存映射发送端(这里也可以通过读出按钮显示写入到共享内存的数据);
输入信息,并单击写入
接收端显示写入信息,这里可以修改接收端信息,在发送端读出
发送端代码:
定义共享内存中的数据结构:
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