怎么通过MapViewOfFile读取共享内存中的数据

gxj1680 2009-07-03 10:51:43
#001 //文件共享。
#002 //蔡军生 2007/10/27 QQ:9073204 深圳
#003 void FileMapping(void)
#004 {
#005 //打开共享的文件对象。
#006 m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,
#007 FALSE,_T("TestFileMap"));
#008 if (m_hMapFile)
#009 {
#010 //显示共享的文件数据。
#011 LPTSTR lpMapAddr2 = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,
#012 0,0,0);
#013 OutputDebugString(lpMapAddr2);
#014 }
#015 else
#016 {
#017 //创建共享文件。
#018 m_hMapFile = CreateFileMapping( (HANDLE)0xFFFFFFFF,NULL,
#019 PAGE_READWRITE,0,1024,_T("TestFileMap"));
#020
#021 //拷贝数据到共享文件里。
#022 LPTSTR lpMapAddr1 = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,
#023 0,0,0);
#024 std::wstring strTest(_T("TestFileMap"));
#025 wcscpy(lpMapAddr1,strTest.c_str());
#026
#027 FlushViewOfFile(lpMapAddr1,strTest.length()+1);
#028 }
#029 }
(http://blog.csdn.net/caimouse/archive/2007/10/27/1848910.aspx)

1.为什么在通过MapViewOfFile读取共享内存时,只能得到第一个字符"T"?MapViewOfFile的参数怎么设置啊?设置后依然取不到后面的字符,取不到完整的字符串"TestFileMap"?
2.能不能通过CreateFileMapping传递结构体?在强制转化为结构体时,给其赋值时会出错?
...全文
788 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyu_tiger 2011-01-04
  • 打赏
  • 举报
回复
楼主,你在两个不同的工程下传递结构体,是怎么实现的, 结构体中定义的类型有什么要求? 结构体里面的数据是怎么赋值的?
mmxqq 2009-08-02
  • 打赏
  • 举报
回复

mark

gxj1680 2009-07-03
  • 打赏
  • 举报
回复
再问下,若在两个不同的工程下传递结构体能行吗?
1.struct STData
{
LPTSTR strID;
LPTSTR strPermission;
};
stData->strID = _T("abc");
stData->strPermission = _T("123");
只能得到123,不能得到abc?
2.但struct STData
{
// LPTSTR strID;
// LPTSTR strPermission;
int nNum1;
int nNum2;
};是成功的,难到是因为与传的是否是数字有关?
xylicon 2009-07-03
  • 打赏
  • 举报
回复
没出现只显示一个字符“T”的问题,估计是你字符串读取有问题。或者其他的问题。
gxj1680 2009-07-03
  • 打赏
  • 举报
回复
果然,哇哇哭啊,我晕,忘了给读取的工程设置为UNICODE了
谢谢各位了
另外第一次建工程时传递结构体时
STData* stData = (STData*)MapViewOfFile(hFile, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
stData->strID = _T("abc");
stData->strPermission = _T("123");
走到stData->strID = _T("abc");就中断了,现在再重新调时却通过了,找不到中段的地方了,无语啊我
估计是我写demo程序时太着急了
问题解决了,谢谢各位了
贪玩的老鼠 2009-07-03
  • 打赏
  • 举报
回复
因为你使用宽字符写入到MAPFILE中,而读出来的时候却用LPTSTR
导致数据类型不一致!你修改的你的
std::wstring strTest(_T("TestFileMap"));
#025 wcscpy(lpMapAddr1,strTest.c_str());

改成strcpy(lpMapAddr1,"TestFileMap");即可.
如果你要使用结构体的话.
struct mapstruct
{
int a;
double c;
} ;
mapstruct lpMapAddr1 = (mapstruct)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,
0,0,0);
就可以直接使用结构体了!
ahao 2009-07-03
  • 打赏
  • 举报
回复
读取项目不是unicode设置
读取的时候当成char*了,所以只显示T
  • 打赏
  • 举报
回复
首先你确定你的工程的unicode设置是什么
如果是非unicode的话那就需要改代码了
std::wstring strTest(_T("TestFileMap"));
改成
std::wstring strTest( L"TestFileMap" );

或者干脆直接全中间形式
#024 std::wstring strTest(_T("TestFileMap"));
#025 wcscpy(lpMapAddr1,strTest.c_str());
换成
_tcscpy(lpMapAddr1,_T("TestFileMap"));
skyxie 2009-07-03
  • 打赏
  • 举报
回复
你的项目编码是不是unicode,如果不是,改成unicode

因为你是用wstring写的,读的时候也必须是unicode
std::wstring strTest(_T("TestFileMap"));
#025 wcscpy(lpMapAddr1,strTest.c_str());
#026
gxj1680 2009-07-03
  • 打赏
  • 举报
回复
读取的时候用的是
//显示共享的文件数据。
#011 LPTSTR lpMapAddr2 = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,
#012 0,0,0);
跟踪显示lpMapAddr2的值只是"T",不是"TestFileMap"
  • 打赏
  • 举报
回复
1你检查你读取的时候是不是宽字符
2可以传递结构体,但要注意某些类型不跨进程。

2,586

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧