zoukankan      html  css  js  c++  java
  • Windows核心编程——进程间通信之dll共享段

     使用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"..shareDllshareDll.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) 共享的数据必须初始化, 否则共享失败。

  • 相关阅读:
    【Elasticsearch 技术分享】—— ES 常用名词及结构
    【Elasticsearch 技术分享】—— Elasticsearch ?倒排索引?这都是什么?
    除了读写锁,JUC 下面还有个 StampedLock!还不过来了解一下么?
    小伙伴想写个 IDEA 插件么?这些 API 了解一下!
    部署Microsoft.ReportViewe
    关于TFS强制undo他人check out
    几段查看数据库表占用硬盘空间的tsql
    How to perform validation on sumbit only
    TFS 2012 Disable Multiple Check-out
    在Chrome Console中加载jQuery
  • 原文地址:https://www.cnblogs.com/zhaoyixiang/p/12985010.html
Copyright © 2011-2022 走看看