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 |
不错,很有创意的做法。 |