社区
Windows SDK/API
帖子详情
如何通过DLL在进程间共享变量?
代码之诗
2003-12-18 06:05:54
通过共享内存块或内存映射文件未免小题大做了。
在VC中#pragma指令有个微软的扩展:data_seg,它可以用来创建一个全局共享的数据段,这个数据段中的变量即可在线程间共享——只要这些线程都加载了含有该数据段的DLL。可CB中好象没有这个扩展,那么在CB中如何实现这种变量共享呢?
请高手不吝赐教。谢谢。
...全文
178
26
打赏
收藏
如何通过DLL在进程间共享变量?
通过共享内存块或内存映射文件未免小题大做了。 在VC中#pragma指令有个微软的扩展:data_seg,它可以用来创建一个全局共享的数据段,这个数据段中的变量即可在线程间共享——只要这些线程都加载了含有该数据段的DLL。可CB中好象没有这个扩展,那么在CB中如何实现这种变量共享呢? 请高手不吝赐教。谢谢。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
26 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
代码之诗
2004-01-10
打赏
举报
回复
最后顶一次,再没人知道偶就结帖算了。唉,不爽。
代码之诗
2004-01-04
打赏
举报
回复
偶在 Borland 的网站上找了半天也没找到啊。
自已顶一次:
在CB中用预处理指令:
#pragma option -zRSectionName
可以指定本文件中的数据所在的数据段名,和 VC 中的:
#pragma dataseg
指令一个效果,可是,在 CB 的帮助中,根本没有这个 #pragma option -zRSecttionName 指令的影子,很想知道高手们从哪知道的这个指令。
所谓知其然,欲知其所以然。请高手指教啊。
yjy1001
2004-01-02
打赏
举报
回复
我也不懂 —— 等老妖,老季等大侠来回答吧
学习研究中,可惜偶的英文水,否则应该可以在Borland的网站上看个明白
期待的高手的解答~!
up上去
tgzhang
2004-01-02
打赏
举报
回复
其实可以使用BCB中提供的包package来解决这个问题,这样在概念上非常清晰。
jbz
2004-01-02
打赏
举报
回复
mark
柯本
2004-01-02
打赏
举报
回复
我是按
http://expert.csdn.net/Expert/topic/2381/2381756.xml?temp=.980694
方法作的,没问题!
SnHnBn
2004-01-02
打赏
举报
回复
有个疑问,不知道这种跨进程通讯方式是否容易移植。在Unix/Linux下能不能用?
代码之诗
2004-01-01
打赏
举报
回复
天啊,坛子里有没有Borland 的人啊,能告诉我这个问题吗?非典型困惑中。
winewinder
2003-12-31
打赏
举报
回复
#pragma data_seg(".share") // must be difined as SHARED in .def file
......
#pragma data_seg()
#pragma comment(linker, "/section:.share, rws")
用这个试试看
代码之诗
2003-12-31
打赏
举报
回复
to winewinder(winewind) :
问题是已经解决了的。用的是 #pragma option -zR。阁下给出的是在 VC 下的方案,在CB里用不了的。
我只是想知道:#pragma option -zR 里面,这个 -zR 参数是哪里得来的,因为CB的帮助文件里找不到。
代码之诗
2003-12-30
打赏
举报
回复
有没有哪位知道 #pragma option -zR 或 -zT 选项的来历啊?这样结帖才算完美啊。
mme
2003-12-22
打赏
举报
回复
static 方案的确是不能完成共享变量任务的。
shire
2003-12-19
打赏
举报
回复
mark
yjy1001
2003-12-19
打赏
举报
回复
"网中得鱼,不知网从何来,郁闷中。"
经典! 现在要上班 忙ing……
代码之诗
2003-12-19
打赏
举报
回复
总算有了结果了,做个小总结吧:
yjy1001(蓝鲸--优秀得郁闷的鱼)的方案可用。
不过, yjy1001(蓝鲸--优秀得郁闷的鱼)给出的也太繁杂了,淹没了真正的细节。一般情况下,如果不是要定义许多段的话,类名可以不用。所以,我只用了一个CPP文件,将想共享的变量定义在其中,并在文件的开头写上:
#pragma option -zR段名
在DEF文件中写上:
SECTIONS
段名 READ WRITE SHARED
这样,通过DLL实现进程间变量共享的问题就解决了。至于yjy1001(蓝鲸--优秀得郁闷的鱼)代码中给出的 #pragma data_seg 这样的指令,其实是为了能在 VC 下编译并达到一样的效果。至于 #pragma argsused 则与本问题完全无关了——顺便说一句:它应该紧靠在一个函数定义的前面。
问题是解决了,心情却十分郁闷:查遍了 CB 的帮助,#pragma option 的选项应该就是编译器命令行参数,但 BCC32 的参数中并没有 -zR 或 -zT 项。不知众位高手从何处得来此用法,敬请告知在下,感激不尽。
网中得鱼,不知网从何来,郁闷中。
代码之诗
2003-12-18
打赏
举报
回复
关于static方法的问题,下面是我的验证程序:
/////////////////////////////////////////////////////////////////////////
// 第一部分:DLL源代码
// mydll.cpp
#include <windows.h>
#define MYDLL_FUNC __declspec(dllexport) _stdcall
static unsigned long g_value = 100;
extern "C" unsigned long MYDLL_FUNC GetValue()
{
return g_value;
}
extern "C" void MYDLL_FUNC SetValue(unsigned long newValue)
{
g_value = newValue;
}
// 第一部分:DLL源代码
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
// 第二部分:测试程序源代码
#include <windows.h>
#include <iostream>
#pragma hdrstop
#ifdef __BORLANDC__
#pragma argsused
#endif
int main( int argc, char * argv[] )
{
using namespace std;
HMODULE hMdl = LoadLibrary("MyDll.dll");
if(hMdl == 0) {
cerr << "Cannot load MyDll.dll." << endl;
return -1;
}
typedef void (_stdcall *SetPtr_T)(unsigned long);
typedef unsigned long (_stdcall *GetPtr_T)();
SetPtr_T setPtr;
GetPtr_T getPtr;
setPtr = reinterpret_cast<SetPtr_T>(GetProcAddress(hMdl, "SetValue"));
getPtr = reinterpret_cast<GetPtr_T>(GetProcAddress(hMdl, "GetValue"));
if(setPtr == 0 || getPtr == 0) {
cerr << "Cannot get function address." <<endl;
return -2;
}
char cmd;
unsigned long value;
while(cmd != 'q') {
cout << "Input command :" << endl;
cin >> cmd;
switch(cmd) {
case 's':
cin >> value;
(*setPtr)(value);
break;
case 'g':
value = (*getPtr)();
cout << value <<endl;
break;
case 'q':
break;
default:
cerr << "unknown command." << endl;
break;
}
}
return 0;
}
// 第二部分:测试程序源代码
/////////////////////////////////////////////////////////////////////////
测试程序使用方法:输入 g 并回车,程序将输 g_value 的值。输入 s # 并回车,程序将设置 g_value 的值为 # 。输入 q 并回车退出。
只要分别启动测试程序的两个进程,分别设置、读取 g_value 的值,就知道该值是否共享了。通过这个测试,我发现 static 方案并不能完成共享变量的任务。
如有不当处,请指正。
代码之诗
2003-12-18
打赏
举报
回复
to yjy1001(蓝鲸--优秀得郁闷的鱼) :
看了好几遍CB的帮助,CB没有 #pragma data_seg 指令,这个指令好象只是VC的扩展。而#pragma 类的指令是不报错的,无法用简单的编译一次试试来验证,所以在下心存疑惑,望先生有以教我。
Friecin
2003-12-18
打赏
举报
回复
static 可以搞定。
代码之诗
2003-12-18
打赏
举报
回复
试验结论之1:用 static 定义是不可以的。遗憾ing...
yjy1001
2003-12-18
打赏
举报
回复
楼主可以 去SDK面版搜索:
共享(内存)
全局(钩子)
里面有些文章对 —— 共享内存的使用介绍得比较详细。
加载更多回复(6)
Delphi多个
DLL
共享
全局数据Demo
若要在多个
DLL
间
共享
数据,需要特殊处理。通常,我们会创建一个全局的静态类或使用内存映射文件来实现
共享
。 3. **静态类的使用**:在Delphi中,可以创建一个静态类(Singleton),并将其作为全局访问点。静态类...
精通Windows.API-函数、接口、编程实例.pdf
11.5.2 通过File Mapping在
进程
间
共享
数据 333 11.5.3 Windows Socket 333 第12章 Windows Shell程序设计 334 12.1 Windows Shell目录管理 335 12.1.1 Shell对目录和文件的管理形式 335 12.1.2 “我的文档...
使用
DLL
在
进程
间
共享
数据
DLL
入门浅析(5)——使用
DLL
在
进程
间
共享
数据 在Win16环境中,
DLL
的全局数据对每个载入它的
进程
来说都是相同的,因为所有的
进程
用的都收同一块地址空
间
;而在Win32环境中,情况却发生了变化,每个
进程
都有了它...
使用
DLL
在
进程
间
共享
内存_如何在多
进程
中用
共享
DLL
共享
数据
DLL
允许
进程
以类似于Windows 3.1
DLL
共享
数据的方式访问读写数据,多个
进程
都可以对该
共享
数据
DLL
进行数据操作,达到
共享
数据的目的。在WIN32中为建立
共享
内存,必须执行以下步骤: 首先创建一个有名的...
DLL
和EXE怎样
共享
全局
变量
?
全局
共享
数据 #pragma data_seg ("shareddata") HWND sharedwnd=NULL;//
共享
数据 #pragma data_seg() 编译选项加入 /SECTION:shareddata,rws ============================ 用p
Windows SDK/API
1,222
社区成员
8,136
社区内容
发帖
与我相关
我的任务
Windows SDK/API
C++ Builder Windows SDK/API
复制链接
扫一扫
分享
社区描述
C++ Builder Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章