程序启动时调一次MapViewOfFile(),然后连续两次写、读,结果都是第二次写入值

WYHVC 2009-09-07 02:59:48
程序1读取bmp数据,传给程序2。
程序1启动时,调用一次CreateFileMapping()和MapViewOfFile(),
程序1启动起来后:
读取bmp1数据,记为bmpData1
读取bmp2数据,记为bmpData2
程序1响应按钮btnSend函数:
程序1将bmpData1写入内存,然后SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);告知程序2,程序2调用OpenFileMapping(),Data1=MapViewOfFile(),再将Data1保存到一个byte *m_pData1;//-------(1)
程序1将bmpData2写入内存,然后SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);告知程序2,程序2调用OpenFileMapping(),Data2=MapViewOfFile(),再将Data2保存到一个byte *m_pData2;//--------(2)

结束。
在程序2的(1)处,m_pData1还是正确的,可是到(2)处后,m_pData1就变成等于m_pData2了,
疑问:
1.是不是m_pData1和m_pData2都是同一个内存地址?可是我在程序2中将m_pData1和m_pData2分别初始化:m_pData1=NULL,m_pData1=new byte(),析构函数中判断if(m_pData1!=NULL)
{delete m_pData1; m_pData1=NULL;}结果还是两个数据都是第二次写入的值,而且到析构还是那里还报错。
2.是不是需要每次写入都要重新CreateFileMapping()和MapViewOfFile()?
...全文
208 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nothize 2009-09-08
  • 打赏
  • 举报
回复
可以用簡略了的源碼代替文字嗎? 畢竟文字並不精確.
WYHVC 2009-09-08
  • 打赏
  • 举报
回复
m_pData1释放内存了,就是UnmapViewOfFile的时侯还是出错
WYHVC 2009-09-08
  • 打赏
  • 举报
回复
没写完,我的意思是不是需要给m_pData1释放内存?我不知道怎么看内存泄露,因为都是直接用程序1直接启动程序2,不能调试
WYHVC 2009-09-08
  • 打赏
  • 举报
回复
谢谢qimiao77,果然改好了,我基础太烂
接收端每次都是
hAMap = OpenFileMapping(FILE_MAP_READ ,
TRUE,
_T("bmpDataMem"));
Data1=(byte *)MapViewOfFile(hAMap,FILE_MAP_READ,0,0,0);
m_pData1= (byte*)malloc(dataLength) ;
memset(m_pData1,0,dataLength);
memcpy(m_pData1,Data1,dataLength);
这样就好了
还想请教,接收端需不需要每次再调
UnmapViewOfFile(terData)?我第二次调就出错。
还有,如果不用m_pData1了,比如下次重换数据重新传的时候,m_pData1是不是还要重新malloc,重新memcpy?
MoXiaoRab 2009-09-08
  • 打赏
  • 举报
回复
你都写在一个地方了,当然是最后一次写的数据了
dirdirdir3 2009-09-08
  • 打赏
  • 举报
回复
Multiple views of a file (or a file-mapping object and its mapped file) are said to be "coherent" if they contain identical data at a specified time

也就是两个由mapviewoffile返回的指针(相同的file)是指向同一个地方的.......
贪玩的老鼠 2009-09-08
  • 打赏
  • 举报
回复
猜想你将Data1赋值给m_pData1是这么做的m_pData1=Data1,
而你带开的MAP是同一个FILEMAP.

所以你的m_pData1会变,且释放内存的时候也会出错.

在分配m_pData1内存的时候要足够大容纳Data1,
memset将分配的内存清0,
再使用memcpy将DATA1的内容复制到m_pData1即可.
不能用指针直接等,否者指针m_pData1指向的是Data1的地址,



16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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