捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:主程序与DLL之间的全局变量问题
sephil 7163 2004/7/26 14:33:54
:)
dinkysoft 7162 2004/7/26 14:05:17
谢谢sephil,
我记起陈宽达的深度历险里面说在VC里很容易实现程序间的数据共享。但在Delphi就比较麻烦。  虽然现在我不用VC来开发项目!但还是要谢谢你!
sephil 7161 2004/7/26 12:12:55
CreateFileMapping的例子在 http://vip.efile.com.cn/sephil/MemShare.rar
sephil 7160 2004/7/26 12:09:17
1.在MFC应用程序中加入一个MFC Extension DLL

  选择Project|Add To Project|New...菜单对话框中的Projects标签,点中MFC AppWizard(dll),取名为Single,其余默认。在MFC AppWizard-Step 1 of 1对话框中,选择MFC Extension DLL(using shared MFC DLL)。通过下面的步骤实现这个DLL。

  2.实现共享数据和导出函数

  用#pragma data_seg指令实现共享数据段。在Single.cpp包含头文件的语句后添加下列语句:

#pragma data_seg(".SharedData")
long m_nRun=-1;
#pragma data_seg( )
 

  其中,.SharedData就是我们实现的共享数据段的名称。这个数据段只包含一个变量long m_nRun,初始值为-1。

  下面在Single.def文件中使用SECTIONS语句设置该共享数据段的属性:

SECTIONS
; Section name below
.SharedData READ WRITE SHARED 

  这样就使得使用这个DLL的应用程序能以读写方式共享.SharedData中定义的变量。

  然后设计检查程序已运行实例个数的函数并导出,仍然使用def文件:

EXPORTS
; Explicit exports can go here
JudgeNo @1 

  所要添加的只是JudgeNo @1这一条语句,意思是JudgeNo是第一个输出函数,如果需要,还可以添加其他函数。JudgeNo的实现是在Single.cpp中。

long JudgeNo( )
{return m_nRun;} 

  这里只是简单的返回了m_nRun的值,因为这个函数是供应用程序调用的。同时还要在Single.cpp的入口点函数DllMain返回成功值的语句前添加语句m_nRun++,意思是在应用程序启动连接DLL成功时对已经运行的实例进行计数。这里需要强调的是DLL共享数据的概念,它指的是多进程调用DLL时内存中只保存数据的一个副本供它们共同拥有,因此这里的变量m_nRun可以起到为程序所有运行的实例计数的作用。
dinkysoft 7151 2004/7/26 8:45:41
谢谢各位的回答。为什么我要写这篇文章,是因为还有一部分不懂的。因为我要帮助这部分不懂的人懂得怎样在DLL与Exe之间传递变量。如果我们中国人能团结。把大家的东西拿出来共享。我想我们中国的程序员并不比其他家的程序员差的。但是为什么我们的软件没有其他国家的好呢。如果大家一起努力把先进的经验拿出来共享。让大家一起进步的话!我想我们会做得更好。我只能靠我个人的力量尽力微薄之力。

sephil您说dll可以直接和exe共享数据,用API也可以在程序间共享数据,CreateFileMapping等
您能跟我们说说怎么样利用API在程序间共享数据。谢谢
sephil 7147 2004/7/26 1:34:42
@GetCurUserName := GetProcAddress(GetModuleHandle(pchar(application.Exename)), 'CurUserName');
可以简化为
@GetCurUserName := GetProcAddress(Application.Handle, 'CurUserName');
hotyei 7144 2004/7/25 16:18:20
楼主做成 dll 相信是希望将整个项目做成插件式的吧。楼主这个经验的精髓应该是在于是将应用程序当作 dll 来处理,这点是我从来没有想到的。我一直以为,dll 就是 dll,exe 就是 exe, 没想过 exe 也可以使用 GetProcAddress 来取得函数地址。
sephil 7141 2004/7/25 14:09:26
我就是站在技术的角度去看的
用几个简单API就能实现的功能,为什么要那么麻烦搞个dll?况且也没有什么值得称道的技术
我并没有说能利用自己懂得的技术去解决问题不好
我只是不赞同那种"反正我能解决这个问题了,有更好的办法我也不想知道"的想法
"如果你写的软件在网上什么都有相关的资料,在这么大竞争的市场,你的软件还有多大价值吗"
说得好,就因为没有资料,才需要去学习,去钻研
没有资料不是逃避的理由
upp 7139 2004/7/25 10:57:46
hotyei说的好。一个好的技术人员不是拥有多少技术,而是拥有解决问题的能力!
hotyei 7137 2004/7/25 7:35:33
原来是sephil,怪不得这么说。
我的确是没使用 DLL 开发过商业软件,我以前是使用 BPL的。我觉得大家是以一个技术的角度去看上面的代码。但在我的角度去看,一个人如果在没有相关资料(就如sephil说的CreateFileMapping)的情况下,能够自己解决问题,这就是一个有潜力的人,在公司是一个好的员工。如果你写的软件在网上什么都有相关的资料,在这么大竞争的市场,你的软件还有多大价值吗 ?
sephil 7133 2004/7/24 19:41:02
"反问说没有意思的人,除了这种方法还有别的吗? "
方法多了,VC写的dll可以直接和exe共享数据
用API也可以在程序间共享数据,CreateFileMapping等
只是你自己不会而已
upp 7132 2004/7/24 18:49:54
没有什么价值,为了一个全局变量设置一个dll似乎没有任何价值,而且增加了开发难度。再说,面向对象编程的要求就是最少使用全局变量,如果需要交互,可以用类的消息函数来做。现在我写的程序里面已经没有一个全局变量了(除了VCL自己的)。很遗憾的说,实在没有觉得这篇文章有什么实用价值。

不过我还是赞赏作者的创意的!再接再厉,用面向对象思想来考虑技巧,相信作者可以发现更多有用的技巧的。
hotyei 7129 2004/7/24 16:55:41
方法难度很低,重要的是楼主想到了这种方法。DLL不能共享全局变量是共所周知的,楼主能突破实在是很不错的。反问说没有意思的人,除了这种方法还有别的吗?
root_lh 7114 2004/7/24 15:22:52
这玩意可值得看看。。
dinkysoft 7113 2004/7/24 14:52:03
对还不太懂人有帮助,对懂了的人可能没有什么帮助。
这篇文章是写给还不太懂的人的。
liucaizhi 7111 2004/7/24 14:17:13
我也覺得沒什么意思。
sephil 7103 2004/7/24 10:15:25
觉得没什么意思
hotyei 7099 2004/7/24 8:26:03
不错,很有创意的做法。
第一页 上一页 下一页 最后页 有 38 条纪录 共2页 21 - 38
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表