如何通过DLL在进程间共享变量?

代码之诗 2003-12-18 06:05:54
通过共享内存块或内存映射文件未免小题大做了。
在VC中#pragma指令有个微软的扩展:data_seg,它可以用来创建一个全局共享的数据段,这个数据段中的变量即可在线程间共享——只要这些线程都加载了含有该数据段的DLL。可CB中好象没有这个扩展,那么在CB中如何实现这种变量共享呢?
请高手不吝赐教。谢谢。
...全文
178 26 打赏 收藏 转发到动态 举报
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)

1,222

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧