程序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启动时,调用一次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()?
而你带开的MAP是同一个FILEMAP.所以你的m_pData1会变,且释放内存的时候也会出错.在分配m_pData1内存的时候要足够大容纳Data1,
memset将分配的内存清0,
再使用memcpy将DATA1的内容复制到m_pData1即可.
不能用指针直接等,否者指针m_pData1指向的是Data1的地址,
接收端每次都是
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?