之前的一个小需求:处于同一台电脑的进程A,要给进程B发数据。但是进程B的主窗口在创建时,没有指定类名,也没有指定窗口名,所以无法通过::FindWindow() + ::SendMessage的方式发WM_CopyData的消息。所以最后决定采用进程间通信的方式来解决。
模拟了一个服务端和一个客户端,2个进程间采用共享内存进行通信。
服务端:为了测试使用,所以写了一个死循环,用断点来控制每次写入的时间
void CSharedMemoryMethod::ReadSharedMemoryDataProc(void* pParam)
{
string strMapName("ShareMemory"); // 内存映射对象名称
LPVOID pBuffer;
// 共享内存指针
// 首先试图打开一个命名的内存映射文件对象
HANDLE hMap;
string strComData("This is common data!"); // 共享内存中的数据
hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, strMapName.c_str());
if (NULL == hMap)
{
// 打开失败,创建
hMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
strComData.length()+1,
strMapName.c_str());
// 映射对象的一个视图,得到指向共享内存的指针,设置里面的数据
pBuffer = ::MapViewOfFile(hMap, FILE_MAP_AL