VC 利用DLL共享区间在进程间共享数据及进程间广播消息

转载 2013年12月03日 10:23:31

 在进程间共享数据有很多种方法,剪贴板,映射文件等都可以实现,这里介绍用DLL的共享区间在进程间共享数据,及共享数据有变化时及时的反馈给各相关进程。

 

一.在DLL中设置共享区间

在DLL中是用数据段来实现共享区间的,有了这个共享区间,各进程可以方便的共享数据。

1.先用#pragma data_seg(Name)设置名为Name的数据段。

2.再用#pragma comment(linker, "/SECTION:Name,RWS")设置名为Name的数据段属性。/SECTION就表示为这是一个数据区间,R——Read读,W——Write写,S——Share共享。

如:

const int MAXSTRINGLEN = 1000;

#pragma data_seg("ShareData")

int iTotal = 0;

char szString[MAXSTRINGLEN] = {'\0'};

#pragma data_seg()

#pragma comment(linker, "/SECTION:ShareData,RWS")

注意数据一定要先初始化,否则无效。再写DLL的导出函数来操作数据如添加字符,得到字符串或直接得到字符串指针。

可以用dumpbin /SUMMARY test001.dll来查看新创建的ShareData区域。如下图:

注意段的名字被截断了,再输入dumpbin /SECTION:ShareDat test001.dll查看段的详细信息,如下图:

 

 

 

二.当共享数据有变化及时的反馈给进程

可以在DLL中写一个句柄数组,每个新进程都将自己的句柄写入,当一个进程修改共享区间的数据时,对句柄数组的每个进程发个消息通知下。更简单的办法是向系统广播消息来通知进程共享数据有变化。

注册消息用RegisterWindowMessage()函数:

UINT RegisterWindowMessage(LPCTSTR lpString);

参数lpString表示注册消息的名称。

函数成功返回0xC000到 0xFFFF的值表示消息(即消息处理函数WndProc()中的UINT message)。失败返回0。

MSDN特别说明——当二个不同的进程用相同的消息名称注册时将会得到同一个值。这样不同的进程就可以收到相同的消息了。

 

广播消息用PostMessage (),这个函数用的相当频繁就不细说了。将第一个参数设置为HWND_BROADCAST就会向所有窗口(注1)发送消息。在WndProc()中的switch (message)的default:后作下判断就可以了。

if (message == SHAREDATACHANG_MESSAGE)

    处理函数

 

 

 

注1: HWND_BROADCAST广播消息的说明:The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.

 

/****************************************************************************************************

转载请标明出处,原方地址:http://blog.csdn.net/morewindows/article/details/6702342

****************************************************************************************************/


Windows中使用DLL在进程间共享数据

在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的,因为所有的进程用的都收同一块地址空间;而在Win32环境中,情况却发生了变化,每个进程都有了它自己的地址空间,DLL函数中的代码所...
  • dengxu11
  • dengxu11
  • 2012年10月15日 11:30
  • 932

进程间的数据共享

//========================================================================//TITLE://    进程间的数据共享//AU...
  • norains
  • norains
  • 2008年07月16日 23:19
  • 10739

DLL进程共享

转载请标明是引用于 http://blog.csdn.net/chenyujing1234  欢迎大家拍砖! 第一种方法:数据段共享#pragma data_seg 一、 #pragma ...
  • chenyujing1234
  • chenyujing1234
  • 2012年09月30日 23:51
  • 3319

不同进程间的共享问题

不同进程间的共享问题一直是编程人员常常需要面对,但又不容易解决的问题。我在写程序的工程中也深受其害,从而想到将自己遇到的情况做一下总结,也就促成了这篇文章。文章中重点论述有关数据和内核句柄的共享问题。...
  • welcome_ck
  • welcome_ck
  • 2004年12月24日 16:05
  • 3975

windows核心编程之进程间共享数据

有时候我们会遇到window进程间共享数据的需求,比方说我想知道系统当前有多少某个进程的实例。我们可以在程序中定义一个全局变量,初始化为0,每当程序启动后就加1,当然我们我们可以借助第三方介质来储存这...
  • zxm342698145
  • zxm342698145
  • 2014年06月01日 23:16
  • 1771

使用内存映射文件在进程间共享数据

Windows提供了多种机制允许进程之间能够共享数据。比如,WM_COPYDATA消息,剪贴板,邮件槽(mailslot),管道(pipe),套接字(socket)等。在同一台机器上共享数据库最底层的...
  • lihao21
  • lihao21
  • 2014年08月08日 11:15
  • 3031

使用消息实现进程间通信

1.问题阐述 消息是Windows提供的一种驱动机制,在前面的章节中,已经多次使用消息解决问题了。使用消息进行进程通信的过程,就是使用消息激活某种操作的过程。对于进程间的通信,一般采用用户自定义的消...
  • zhongguoren666
  • zhongguoren666
  • 2011年11月15日 15:03
  • 6008

Posex信号量 实现进程间的同步(生产者&消费者)

Posex信号量sem实现多个线程的互斥,只需在进程空间定义好sem_t变量即可,因为各个线程是共享该sem_t变量。同理,如果sem要实现进程间的互斥,这个sem_t的变量就要在共享存储中定义,因为...
  • ordeder
  • ordeder
  • 2014年03月10日 22:35
  • 1721

进程间共享变量

在php中可以实现在进程间共享信息的途径,并保证能快速地访问这些共享数据。有两种方式:shmop 和 System V这两种共享内存扩展方式。   shmop使用的例子: // create k...
  • u010437896
  • u010437896
  • 2013年05月02日 17:38
  • 1379

DLL共享数据段

在主文件中,用#pragma data_seg建立一 个新的数据段并定义共享数据,其具体格式为: ...
  • xuplus
  • xuplus
  • 2008年04月14日 20:39
  • 9089
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC 利用DLL共享区间在进程间共享数据及进程间广播消息
举报原因:
原因补充:

(最多只允许输入30个字)