使用dll共享数据段在进程中进行通信
在多个进程间共享数据,windows提供了这种方法,就是创建自己的共享数据节,并将需要共享的变量放入该内存中。如果是在相同程序的多个实例间共享数据,只要在exe文件创建共享节即可,否则就需要在DLL中创建共享节,其它进程加载该DLL来共享数据。
在Win32环境下要想在多个进程*享数据,就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段。
方法:
a. 在dll中开辟一段空间, 用来存放共享的数据
b. 将这段空间的属性设为 可读可写可共享
实例:
1) 在dll中开辟一段空间, 用来存放共享的数据
创建一个dll->在DLL的实现文件中添加下列代码:
shareDll.h下:
extern SHAREDLL_API int nshareDll; extern SHAREDLL_API DWORD g_dwValue;
shareDll.cpp下:
#pragma data_seg("shared") //空间的开始 SHAREDLL_API DWORD g_dwValue = 0x87654093; #pragma data_seg() //空间的结束
2) 将这段空间的属性设为 可读可写可共享
#pragma comment(linker,"/SECTION:shared,RWS")
测试usedll:
创建对话框,添加读写按钮和事件,填入代码:
#include"..\shareDll\shareDll.h" #pragma comment(lib,"..\\debug\\sharedll.lib") void CUseDllDlg::OnBnClickedRead() { SetDlgItemInt(EDT_READ, g_dwValue); } void CUseDllDlg::OnBnClickedWrite() { g_dwValue = GetDlgItemInt(EDT_WRITE); }
写入dll的值读的还是写入的值(操作同变量值):
测试共享更多数组:
CreatDll:
extern SHAREDLL_API int nshareDll; extern SHAREDLL_API DWORD g_dwValue; extern SHAREDLL_API char g_aryTest[0x1000]; #pragma data_seg("shared") //空间的开始 SHAREDLL_API DWORD g_dwValue = 0x87654093; char g_aryTest[0x1000] = { 0 }; #pragma data_seg() //空间的结束
UseDll:
void CUseDllDlg::OnBnClickedRead() { SetDlgItemText(EDT_READ, g_aryTest); } void CUseDllDlg::OnBnClickedWrite() { CString str; GetDlgItemText(EDT_WRITE, str); memcpy(g_aryTest, str.GetBuffer(0), str.GetLength() + 1); }
测试:
共享成功
PS:对象也可以共享,但要构造初始化。
注意:
1) #pragma comment(linker,"/SECTION:cr36_shared,RWS")中不要有空格。
2) 共享的数据必须初始化, 否则共享失败。