
主程序写入内存://创建映射数据void CreateMemMap( ){HANDLE hMap; TShareMem*pShareMem; //创建共享内存,最后一个参数为创建的共享内存名称 hMap=::CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,sizeof(TShareMem),_T("MyShareMap")); if ( hMap == NULL ) { AfxMessageBox(_T("不能创建内存映射文件!")); } //写共享内存区,将内存映射为文件 pShareMem =(TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE,0, 0, 0);memcpy(pShareMem->szSendCOM,_T("COM1"),10);memcpy(pShareMem->szReceviceCOM,_T("COM2"),10);memcpy(pShareMem->szTester,_T("zly"),10);}
DLL读取内存数据:void ReadMemMap(){HANDLE hMap; HANDLE hAddress;char szSendCOM[10];char szReceviceCOM[10];char szTester[10]; //读共享内存hMap = ::OpenFileMapping( FILE_MAP_WRITE, false,_T("MyShareMap"));if (hMap == 0 )MessageBox(NULL,_T("读取共享内存!"),_T("提示"),MB_OK);
hAddress = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);if ( hAddress == NULL )MessageBox(NULL,_T("不能打开映射文件!"),_T("提示"),MB_OK);TShareMem* pShareMem;pShareMem = (TShareMem*)hAddress;//初始化数据memset(szSendCOM,0,sizeof(szSendCOM));memset(szReceviceCOM,0,sizeof(szReceviceCOM));memset(szTester,0,sizeof(szTester));//拷贝共享内存区的内容CopyMemory(szSendCOM,pShareMem->szSendCOM,10);CopyMemory(szReceviceCOM,pShareMem->szReceviceCOM,10);CopyMemory(szTester,pShareMem->szTester,10);//释放CloseHandle(hMap); UnmapViewOfFile(hAddress);}
此方法实现主程序向DLL共享数据,反向也可以再共享回来,不过由大家来实现吧^__^
方法二:主程序定义结构体,通过在调用DLL函数时将传递结构体指针也可以实现数据传递。注:在DLL中要使用主程序的控件或者对话框时,最好不要直接传主程序的控件或者对话框的指针,而要传其句柄!!!
VC++ 共享内存数据的实现CreateFileMapping OpenFileMapping