//写入端
//创建共享内存
void C写入端Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//创建共享内存
handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE|SEC_COMMIT, 0, DEF_DATA_SIZE, L"ShareMemSample");
//映射共享内存
if(handle)
{
lpData = MapViewOfFile(handle, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0);
::MessageBox(NULL, L"创建共享内存映射文件成功", L"消息", MB_OK);
}
else
{
::MessageBox(NULL, L"创建共享内存映射文件失败", L"消息", MB_OK);
}
}
//关闭共享内存
void C写入端Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
//撤销映射的共享内存
if(lpData)
{
UnmapViewOfFile(lpData);
}
//关闭共享内存
if(handle)
{
CloseHandle(handle);
}
}
//写数据到共享内存
void C写入端Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
int iLen = data.GetLength()*2 +2;
LPWSTR lpBuf = data.GetBuffer(iLen);
//写入共享内存
memcpy(lpData, lpBuf, iLen);
HWND hWnd = ::FindWindow(NULL, L"接收端");
//通知到接收端
if(hWnd)
{
::PostMessage(hWnd, SHARE_MEM_NOTIFY, 0, 0);
}
}
//读取端
//重载PreTranslateMessage处理SHARE_MEM_NOTIFY数据更新通知消息
BOOL C接收端Dlg::PreTranslateMessage( MSG* pMsg )
{
if(pMsg->message == SHARE_MEM_NOTIFY)
{
OnBnClickedButton1();
}
return CDialog::PreTranslateMessage(pMsg);
}
//从共享内存读取数据
void C接收端Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//打开共享内存
HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ, false, L"ShareMemSample");
if(hMapFile == NULL)
{
::MessageBox(NULL, L"打开共享内存失败", L"消息", MB_OK);
return;
}
//映射共享内存
LPVOID lpBase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
if(lpBase == NULL)
{
::MessageBox(NULL, L"打开共享内存映射文件失败", L"消息", MB_OK);
return ;
}
//读取共享内存数据
data.Format(L"%s", (LPWSTR)lpBase);
UpdateData(false);
//卸载映射的共享内存
UnmapViewOfFile(lpBase);
//关闭共享内存
CloseHandle(hMapFile);
}
C接收端Dlg.cpp 和 C发送端Dlg.cpp 中必须自定义消息#define SHARE_MEM_NOTIFY (WM_USER+1)。
发送端往共享内存里写好数据后,PostMessage(hWnd, SHARE_MEM_NOTIFY, 0, 0); hWnd是接收端窗口句柄,可以用FindWindow(NULL, L"接收端");获得。在接收端重写PreTranslateMessage处理SHARE_MEM_NOTIFY消息。
CreateFileMapping(),MapViewOfFile(),OpenFileMapping()对这个三函数的使用参照MSDN。