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

  • 相关阅读:
    第一章 Java入门
    2020-2021-2 网络对抗技术 20181321 Exp 8 Web基础
    2020-2021-2 网络对抗技术 20181321 Exp7 网络欺诈防范
    2020-2021-2 网络对抗技术 20181321 Exp6 MSF基础应用
    Weblogic漏洞复现:CVE-2020-14882未授权代码执行
    利用cse-2020-16127,cve-2020-16125进行漏洞再现
    实验一-密码引擎-加密API实现与测试
    实验一-密码引擎-加密API研究
    API标准
    020-2021-2 网络对抗技术 20181321 Exp5 信息搜集与漏洞扫描
  • 原文地址:https://www.cnblogs.com/zhaoyixiang/p/12985010.html
Copyright © 2011-2022 走看看