工作问题总结(三十)共享内存续(当文件映射对象的名称未知时)
2014-09-23 16:53
501 查看
前面讲过共享内存(共享内存实现C++
),但是能够读出数据的前提是,文件映射对象的名称已知。
1.已知情况
sever:
client:
上面的服务端和客户端都是已经知道该内存的名称是“GameQueen”,所以能够读取。
2.未知情况
server----调用----->client,也就是当服务器端先存储了数据,名称是根据生成的md5值确定的,然后用createprocess启动客户端,客户端再去共享内存中读取数据。
问题就出现了:当客户端不知道名称时,不知道读取哪里的共享内存。
3.解决办法
::GetCommandLine();这条语句得到的是执行该应用的命令行,所以在后面我们加上一段后缀(即:名称),我们就能得到数据。
上面代码中的szCmdID就可以设置为共享内存的名称,如“GameQueen”.
),但是能够读出数据的前提是,文件映射对象的名称已知。
1.已知情况
sever:
::CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,65536,"GameQueen");
client:
OpenFileMapping(FILE_MAP_READ,FALSE,"GameQueen");
上面的服务端和客户端都是已经知道该内存的名称是“GameQueen”,所以能够读取。
2.未知情况
server----调用----->client,也就是当服务器端先存储了数据,名称是根据生成的md5值确定的,然后用createprocess启动客户端,客户端再去共享内存中读取数据。
问题就出现了:当客户端不知道名称时,不知道读取哪里的共享内存。
3.解决办法
::GetCommandLine();这条语句得到的是执行该应用的命令行,所以在后面我们加上一段后缀(即:名称),我们就能得到数据。
std::string strGamePath; strGamePath = StringUtil::FormatString( "games\\%s\\%s.exe %s", m_strGameKey.c_str(), m_strGameKey.c_str(), szCmdID ); if( !CreateProcess( NULL, (LPSTR)strGamePath.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &m_ClientSI, &m_ClientPI) ) { ZeroMemory( &m_ClientSI, sizeof(m_ClientSI) ); m_ClientSI.cb = sizeof(m_ClientSI); }
上面代码中的szCmdID就可以设置为共享内存的名称,如“GameQueen”.
相关文章推荐
- 通过内存映射文件实现进程间数据共享
- 利用内存映射文件在两个进程间共享数据
- linux下共享内存等文件的权限问题
- 内存映射文件--进程间数据共享
- 使用内存映射文件在进程之间共享数据
- 总结:内存映射文件与内存读写实现进程间通信的比较
- 用文件映射(File Mapping)实现进程间内存共享
- UNIX环境高级编程学习之第十五章进程间通信 - 两个进程通过映射普通文件实现共享内存通信
- 用文件映射(File Mapping)实现进程间内存共享
- 关于用内存映射文件加、解密大文件的问题,谢谢!
- 用C语言读取大文件的问题 内存映射
- 用C语言读取大文件的问题 内存映射
- COM 中内存映射文件和虚拟内存的问题
- Ext - 数组 和 对象(方法) 在继承对象中内存共享问题.
- windows笔记-使用内存映射文件在进程之间共享数据
- Hibernate的对象-关系映射文件中出现的问题
- 用C语言读取大文件的问题 内存映射
- 通过文件映射共享内存
- 用C语言读取大文件的问题 内存映射
- windows笔记-使用内存映射文件在进程之间共享数据