`
pNxio
  • 浏览: 19484 次
社区版块
存档分类
最新评论

【原】关于#pragma data_seg()无法共享数据

    博客分类:
  • VC++
c 
阅读更多

最近使用这个方法调用数据无效,希望给同样困惑的人有些帮助吧~

 

查了一些资料 正好项目中要和别人一起调用我编写的DLL文件

于是在代码中写入:

 

#pragma data_seg("s_data")     // 声明共享数据段,并命名该数据段
  unsigned int     guiCurrentPage = 255;
#pragma data_seg()
#pragma comment(linker,"/SECTION:s_data,RWS")  

 

当前调用这段DLL共享数据段的是项目A的b进程

 

然后再创建项目B的c进程

 

b,c进程同时静态调用“s_data”段

b进程执行

Sleep(700);
guiCurrentPage++;
cout<<"PageNo. is "<<dec<<guiCurrentPage<<endl;

c进程执行

Sleep(500);
cout<<"PageNo. is "<<dec<<guiCurrentPage<<endl;

 执行两进程

共享失败,c进程guiCurrentPage变量并没有跟随b进程变量一起改变

 

DLL的原理应该是:

WIN系统保证系统内存中只驻留一份DLL数据,不同进程在MMC为自己映射出的4GB(32bit)空间内将要调用的代码映射到这份唯一的空间地址上,DLL中的全局变量以不同的拷贝映射到进程自己的内存空间中,这样就实现了DLL的完全分离,进程间调用DLL完全不干扰

 

在使用#pragma data_seg()后,DLL在实际物理地址的内存空间中只保留了一份定义段间数据,于是就可以共享数据了。

 

卡了好半天,对于应该注意的语法问题包括:

1.#pragma data_seg(“section名称”)  section名称必须小于8字节 否则会被截断(这个只要头、尾一致截断后也是一致的,没有什么问题)

2.变量必须初始化,否则会被编译器优化到.bss段

3.#pragma comment(linker,"/SECTION:s_data,RWS")  中的大小写问题

都做了反复的修改,均无效

 

注意我上面的试验方法:

A项目b进程,B项目的c进程

考虑是不是即使是同一DLL的两份不同拷贝也是不行的,

于是将两进程.exe文件和一份DLL文件拷贝到同一目录

运行

通过。

 

结论:两份在不同路径下的同名DLL文件不被系统认为是同一DLL文件,即使查看进程调用的DLL文件名是同一DLL文件

 

 

 

分享到:
评论

相关推荐

    利用pragma data_seg实现程序只能单个实例运行

    利用pragma data_seg实现程序只能单个实例运行测试工程。已在VC 6.0环境下成功运行

    #pragma用法_汇总.doc

    就会自动改变相应的文件 #pragma CODE SEG NEAR SEG NON BANKED前一段时间写函数中断时 经常要加上#pragma语句 否则 编译就会出错 有飞思卡尔的16位单片机写过中断函数的人 就会知道在中断函数前必须加上代码 #...

    MFC 下获取键盘,鼠标的钩子程序

    #pragma data_seg("MySec") HWND g_hWnd=NULL; #pragma data_seg() #pragma comment(linker,"/section:MySec,RWS") /* SEGMENTS MySec READ WRITE SHARE */ #define WM_MSG WM_USER + 500 LRESULT CALLBACK ...

    #pragma_命令集合

    #pragma_命令集合 介绍pragma_命令的用法,使你不再迷茫

    #pragma使用详解 .pdf

    #pragma使用详解 .pdf #pragma使用详解 .pdf #pragma使用详解 .pdf

    #pragma_命令集合.pdf

    #pragma_命令集合.pdf 不错的东西 很重要

    #pragma预编译指令详解

    二、 另一个使用得比较多的#pragma参数是code_seg。格式如: 2 三、 #pragma once (比较常用) 3 四、 #pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。 3 五、 #pragma warning指令 3 六、 ...

    IAR软件的使用说明

    IAR软件的操作使用说明,非常详细,哈哈哈哈哈

    #pragma用法大全.doc

    #pragma用法大全.doc#pragma用法大全.doc

    #pragma预处理指令用法详解

    描述了#pragma 预处理指令的含义及用法。

    C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别

    C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别 pragma once 之前一直用的很好,今天和同事的配合中发现自己没有真正理解pragma once。 原因:同事喜欢把公共的头文件通过生成后事件复制到一个公共的...

    解析#pragma指令

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或...

    #Pragma_Pack.doc

    很详细的讲解 #Pragma_Pack的用法,作用,及效果,一目了然。

    dsp28335开发总结

    1 #pragma CODE_SECTION(InitFlash, "ramfuncs")? 众所周知,微处理器从内存RAM中取指令的速度要比从flash中取指令要快好多倍,但是RAM的缺陷限制了其不能存储用户程序代码,因为RAM掉电会丢失数据,但是其速度要快...

    c/c++ 中进程 共享节 技术

    该资源通过简单的示例,给大家演示 进程共享内存技术的原理,以及实现。 技术要点: #pragma data_seg() ... #pragma commit(linker,"/section:...,rws")

    #pragma预处理指令详解

    #pragma预处理指令详解,对#pragma的一些应用做了一些介绍,希望对你有帮助

    单片机手册

    有飞思卡尔的16位单片机写过中断函数的人,就会知道在中断函数前必须加上代码 #pragma CODE_SEG __NEAR_SEG NON_BANKED ,函数结束的时候最好加上#pragma CODE_SEG DEFAULT(这个也可不加,但最好加上,以防出现bug)

    进程间通讯基础方法-----内存映射

    #pragma data_seg() allocate() 2 创建磁盘文件内存映射对象,通过操作内存映射对象来修改磁盘文件内容,可以实现修改非常巨大文件的修改(16EB)。 3 在分页系统(虚存)上建立命名内存映射对象,然后不同进程间通过...

    #pragma once用法

    详细介绍#pragma once用法,对于初学者可以学习一下

Global site tag (gtag.js) - Google Analytics