创建内存共享的几个步骤: (转)
2011-11-18 22:07
155 查看
创建共享内存分以下几个步骤:
1.定义共享内存的结构体;
2.利用CreateFileMapping函数创建共享内存;
3.定义指向共享内存结构体的指针pShareMem,利用MapViewOfFile函数将刚刚创建的内存映射到定义指针pShareMem。
读写共享内存分以下几个步骤:
1.定义共享内存的结构体;
2.用OpenFileMapping函数打开上面创建的共享内存区,该函数返回共享内存的地址;
3.将共享内存映射为文件指针;
4.定义指向共享内存结构体的指针,将共享内存的内容拷贝到结构体指针里。
HANDLE hMap;
HANDLE hAddress;
int iErrCode;
//第一步要定义所要共享的内容的结构体
typedef struct _TShareMem
{
char Data[256];
}TShareMem;
void CreateMap()
{
CString strBuf;
CString strShare = "共享内存";
char szBuf[256];
TShareMem* pShareMem;
//创建共享内存,这个函数的最后一个参数即是创建的共享内存的名称
hMap=::CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,sizeof(TShareMem),_T("NewMap"));
if ( hMap == NULL )
{
iErrCode = GetLastError();
AfxMessageBox("不能创建内存映射文件!");
}
//写共享内存区,将内存映射为文件
pShareMem = (TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
memcpy(pShareMem,strShare,strShare.GetLength());
//或者代码如下:strcpy(pShareMem->Data,szBuf);
//或者用WriteProcessMemory(),代码如下:
//HANDLE hProcess=::GetCurrentProcess();
//WriteProcessMemory(hProcess,pShareMem,szBuf, 256,0);
//打开刚刚创建的共享内存区,这里可以是另外一个进程中的代码
hMap = ::OpenFileMapping( FILE_MAP_WRITE, false, _T("NewMap"));
if (hMap == 0 )
{
iErrCode = GetLastError();
AfxMessageBox("不能定位内存映射文件块!");
}
//读共享内存区
hAddress = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
// pShareMem = (TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
if ( hAddress == NULL )
AfxMessageBox("Can''t View Memory Map");
//对szBuf进行赋值,每个都是0
memset(szBuf,0,sizeof(szBuf));
//拷贝共享内存区的内容
CopyMemory(szBuf,hAddress,255);
//或者用strcpy(szBuf, hAddress);
//或者用ReadProcessMemory
// HANDLE hProcess=::GetCurrentProcess();
// ReadProcessMemory(hProcess,pShareMem,szBuf, 256,0);
AfxMessageBox(szBuf);
//最后不要忘记释放内核对象
CloseHandle(hMap);
UnmapViewOfFile(hAddress);
}
1.定义共享内存的结构体;
2.利用CreateFileMapping函数创建共享内存;
3.定义指向共享内存结构体的指针pShareMem,利用MapViewOfFile函数将刚刚创建的内存映射到定义指针pShareMem。
读写共享内存分以下几个步骤:
1.定义共享内存的结构体;
2.用OpenFileMapping函数打开上面创建的共享内存区,该函数返回共享内存的地址;
3.将共享内存映射为文件指针;
4.定义指向共享内存结构体的指针,将共享内存的内容拷贝到结构体指针里。
HANDLE hMap;
HANDLE hAddress;
int iErrCode;
//第一步要定义所要共享的内容的结构体
typedef struct _TShareMem
{
char Data[256];
}TShareMem;
void CreateMap()
{
CString strBuf;
CString strShare = "共享内存";
char szBuf[256];
TShareMem* pShareMem;
//创建共享内存,这个函数的最后一个参数即是创建的共享内存的名称
hMap=::CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,sizeof(TShareMem),_T("NewMap"));
if ( hMap == NULL )
{
iErrCode = GetLastError();
AfxMessageBox("不能创建内存映射文件!");
}
//写共享内存区,将内存映射为文件
pShareMem = (TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
memcpy(pShareMem,strShare,strShare.GetLength());
//或者代码如下:strcpy(pShareMem->Data,szBuf);
//或者用WriteProcessMemory(),代码如下:
//HANDLE hProcess=::GetCurrentProcess();
//WriteProcessMemory(hProcess,pShareMem,szBuf, 256,0);
//打开刚刚创建的共享内存区,这里可以是另外一个进程中的代码
hMap = ::OpenFileMapping( FILE_MAP_WRITE, false, _T("NewMap"));
if (hMap == 0 )
{
iErrCode = GetLastError();
AfxMessageBox("不能定位内存映射文件块!");
}
//读共享内存区
hAddress = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
// pShareMem = (TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
if ( hAddress == NULL )
AfxMessageBox("Can''t View Memory Map");
//对szBuf进行赋值,每个都是0
memset(szBuf,0,sizeof(szBuf));
//拷贝共享内存区的内容
CopyMemory(szBuf,hAddress,255);
//或者用strcpy(szBuf, hAddress);
//或者用ReadProcessMemory
// HANDLE hProcess=::GetCurrentProcess();
// ReadProcessMemory(hProcess,pShareMem,szBuf, 256,0);
AfxMessageBox(szBuf);
//最后不要忘记释放内核对象
CloseHandle(hMap);
UnmapViewOfFile(hAddress);
}
相关文章推荐
- 创建内存共享的几个步骤:
- 创建共享内存分以下几个步骤
- 创建共享内存分以下几个步骤
- 创建进程,消息通信,共享内存通信,管道通信
- 创建共享内存
- orcle 创建用户的几个步骤
- 手动删除shmget创建的共享内存
- Linux下共享内存及线程的创建
- qt 创建共享内存举例
- 共享内存的创建和映射shmget()和shmat()
- 『Numpy』内存分析_利用共享内存创建数组
- 关于Python multiprocessing.Array创建的共享内存无法删除的问题
- 进程间通讯共享内存的具体步骤
- c++中用boost实现共享内存创建map容器
- 关于Python multiprocessing.Array创建的共享内存无法删除的问题
- VC进程间共享内存的实现步骤
- 关于Python multiprocessing.Array创建的共享内存无法删除的问题
- Linux下的共享内存(02)---创建共享内存
- Linux上创建共享库so(简单步骤)
- 在VMware Workstation环境下CentOS虚拟机中创建与主机共享文件夹的详细步骤