很多时候,我们要用到多线程,和多进程,但是进程之间的通讯有很多种,实用点儿的容易理解和学习的也就是共享内存了,下面我们就来看看吧!
首先,我们要做的就是创建一个共享内存的结构体,你也可以创建数组或者其他的都可以
typedef struct _TShareMem
{
char Data[256];
}TShareMem;//创建共享内存结构体
然后创建句柄变量和返回错误的的变量
HANDLE hMap;
HANDLE hAddress;
int iErrCode;
其次,我们要创建一个对象
TShareMem* pShareMem;//开辟内存
接下来,我们就要开始创建共享内存了,要用到CreateFileMapping()这个系统API函数,
hMap = ::CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0, sizeof(TShareMem), _T("NewMap"));
总共6个参数,第五个是共享内存的大小,最后一个是共享内存的名称,就像我们定义变量也需要名称一样。我们在另外一个进程要打开这个共享内存的时候也需要用到这个名称
if (hMap == NULL)//判断一下创建成功了没有,返回NULL的话就是没有创建成功
{
iErrCode = GetLastError();//我们可以通过GetLastError来查看创建失败的原因
MessageBox(NULL,L"不能创建内存映射文件!",L"error",MB_OKCANCEL);
}
创建成功之后我们就要进行数据的写入了,要写入数据首先就是要打开这个共享内存,我们刚刚只是创建了并没有打开,要用到MapViewOfFile()函数
pShareMem = (TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);//返回共享内存地址强转为我们定义的结构体类型,我们拿到了首地址就可以对内存进行操作了
memcpy(pShareMem, strShare, strlen(strShare));//将数据拷贝进共享内存
这样,就搞定了创建共享内存并写入,
下面我们就来看看取出数据吧!当然这个就需要写到另外一个进程的代码里面
首先,打开共享内存,当然我们要用到上面的共享内存名称NewMap
//打开刚刚创建的共享内存区
hMap = ::OpenFileMapping(FILE_MAP_WRITE, false, _T("NewMap"));//返回句柄
if (hMap == 0)
{
iErrCode = GetLastError();
MessageBox(NULL, L"不能定位内存映射文件块!", L"error", MB_OKCANCEL);
}
当然也要定义一个结构体类型的对象来装数据
TShareMem* pShareMem1;
pShareMem1 = (TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); //返回共享内存地址并强转
这样就,完成了,,,