最近使用这个方法调用数据无效,希望给同样困惑的人有些帮助吧~
查了一些资料 正好项目中要和别人一起调用我编写的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实现程序只能单个实例运行测试工程。已在VC 6.0环境下成功运行
就会自动改变相应的文件 #pragma CODE SEG NEAR SEG NON BANKED前一段时间写函数中断时 经常要加上#pragma语句 否则 编译就会出错 有飞思卡尔的16位单片机写过中断函数的人 就会知道在中断函数前必须加上代码 #...
#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使用详解 .pdf #pragma使用详解 .pdf #pragma使用详解 .pdf
#pragma_命令集合.pdf 不错的东西 很重要
二、 另一个使用得比较多的#pragma参数是code_seg。格式如: 2 三、 #pragma once (比较常用) 3 四、 #pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。 3 五、 #pragma warning指令 3 六、 ...
IAR软件的操作使用说明,非常详细,哈哈哈哈哈
#pragma用法大全.doc#pragma用法大全.doc
描述了#pragma 预处理指令的含义及用法。
C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别 pragma once 之前一直用的很好,今天和同事的配合中发现自己没有真正理解pragma once。 原因:同事喜欢把公共的头文件通过生成后事件复制到一个公共的...
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或...
很详细的讲解 #Pragma_Pack的用法,作用,及效果,一目了然。
1 #pragma CODE_SECTION(InitFlash, "ramfuncs")? 众所周知,微处理器从内存RAM中取指令的速度要比从flash中取指令要快好多倍,但是RAM的缺陷限制了其不能存储用户程序代码,因为RAM掉电会丢失数据,但是其速度要快...
该资源通过简单的示例,给大家演示 进程共享内存技术的原理,以及实现。 技术要点: #pragma data_seg() ... #pragma commit(linker,"/section:...,rws")
#pragma预处理指令详解,对#pragma的一些应用做了一些介绍,希望对你有帮助
有飞思卡尔的16位单片机写过中断函数的人,就会知道在中断函数前必须加上代码 #pragma CODE_SEG __NEAR_SEG NON_BANKED ,函数结束的时候最好加上#pragma CODE_SEG DEFAULT(这个也可不加,但最好加上,以防出现bug)
#pragma data_seg() allocate() 2 创建磁盘文件内存映射对象,通过操作内存映射对象来修改磁盘文件内容,可以实现修改非常巨大文件的修改(16EB)。 3 在分页系统(虚存)上建立命名内存映射对象,然后不同进程间通过...
详细介绍#pragma once用法,对于初学者可以学习一下