程序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()?

解决方案 »

  1.   

    猜想你将Data1赋值给m_pData1是这么做的m_pData1=Data1,
    而你带开的MAP是同一个FILEMAP.所以你的m_pData1会变,且释放内存的时候也会出错.在分配m_pData1内存的时候要足够大容纳Data1,
    memset将分配的内存清0,
    再使用memcpy将DATA1的内容复制到m_pData1即可.
    不能用指针直接等,否者指针m_pData1指向的是Data1的地址,
      

  2.   

    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)是指向同一个地方的.......
      

  3.   

    谢谢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?
      

  4.   

    没写完,我的意思是不是需要给m_pData1释放内存?我不知道怎么看内存泄露,因为都是直接用程序1直接启动程序2,不能调试
      

  5.   

    m_pData1释放内存了,就是UnmapViewOfFile的时侯还是出错