您的位置:首页 > 其它

工作问题总结(三十)共享内存续(当文件映射对象的名称未知时)

2014-09-23 16:53 501 查看
前面讲过共享内存(共享内存实现C++
),但是能够读出数据的前提是,文件映射对象的名称已知。

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”.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: