znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
阅读:1951回复:16

大家讨论一下软件模块化的途径 (BCB环境)

楼主#
更多 发布于:2002-11-14 10:00
大家讨论一下软件模块化的途径

我们要开发一个软件,以前是所有模块都写在一起,也就是全用源码的综合来实现一个软件,发现很多问题。
现在想用dll技术来实现。把每一个独立的模块都用dll来实现。一些功能简单的可以直接导出函数就行了。但我想在
dll里面导出类,并想采用动态加载.如果是静态加载的话, 这不成任何问题,但这样一来,如果dll修改了一些,那exe也要重新编译,真的很烦。但我们不想用
com来实现,调起来麻烦。
有什么办法来动态加载动态库中的c++类?

开发工具 bcb6 vcl库

最新喜欢:

ytoneboyytoneb...
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-14 10:07
1,“动态加载动态库中的c++类”?没明白
2,“并想采用动态加载.如果是静态加载的话, 这不成任何问题,但这样一来,如果dll修改了一些,那exe也要重新编译”,静态和动态有本质区别吗?为何“如果dll修改了一些,那exe也要重新编译”?只要DLL导出的东西没变,exe就不用修改!
3,500分?哄抬物价啊。现在这里已经通货膨胀了 :(
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
debug
驱动大牛
驱动大牛
  • 注册日期2002-06-06
  • 最后登录2012-10-15
  • 粉丝0
  • 关注0
  • 积分105分
  • 威望12点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-14 10:17
调用动态连接库的时候,想办法让应用程序随时能够知道被调用函数的所在模块,这样,让连接器方便的知道在应用程序中添加必要的信息(即所谓的引入库),使应用程序能够随时找到北调用函数所再的动态连接库即库文件的位置。
偶爱c/c++,正如世人爱上帝一样。。。。 唐僧正在火焰山下分配工作:“悟空去借芭蕉扇,悟净去找水--八戒,你怎么还有空看偶的个人资料??
w8zz
驱动小牛
驱动小牛
  • 注册日期2001-12-12
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-11-14 10:20
我以前的活儿也有类似的~~~99年的事儿~~
最后我们不怕烦~dll一变,全部工程也重作~~
要导出c++类的dll我们也是静态连接的~~
这样就不太出问题了~~~~

当然动态连接也可以~~~
但像那个c++类的动态new实例却没做过~~~
但你导出dll一个函数,这个函数就是为了动态new实例
最后返回实例指针就可以了~~当然你的host app的工程
要包含那个特定c++类的头文件~~~至少也得是那个c++类
的基类说明头文件

大家讨论一下软件模块化的途径

我们要开发一个软件,以前是所有模块都写在一起,也就是全用源码的综合来实现一个软件,发现很多问题。
现在想用dll技术来实现。把每一个独立的模块都用dll来实现。一些功能简单的可以直接导出函数就行了。但我想在
dll里面导出类,并想采用动态加载.如果是静态加载的话, 这不成任何问题,但这样一来,如果dll修改了一些,那exe也要重新编译,真的很烦。但我们不想用
com来实现,调起来麻烦。
有什么办法来动态加载动态库中的c++类?

开发工具 bcb6 vcl库
小熊和二申公豹 [img]http://www.driverdevelop.com/forum/upload/w8zz/2003-08-11_黑爸.jpg[/img] 二哥,三娃儿,快帮忙!
w8zz
驱动小牛
驱动小牛
  • 注册日期2001-12-12
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-11-14 10:23
那么基类不变~~~你的host app也不用重编了~~~


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 :(  
给点分吧~~~~
 :(
小熊和二申公豹 [img]http://www.driverdevelop.com/forum/upload/w8zz/2003-08-11_黑爸.jpg[/img] 二哥,三娃儿,快帮忙!
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
5楼#
发布于:2002-11-14 10:23
能详细一些吗?

我们想在dll中声明一个类
然后用loadlibrary 载入后生成类的实例,
这样方便点,不用重新编译exe.

不知道有什么更进一步的方法?
我知道com就是这样做的,但不想用com
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-14 10:37
能详细一些吗?

我们想在dll中声明一个类
然后用loadlibrary 载入后生成类的实例,
这样方便点,不用重新编译exe.

不知道有什么更进一步的方法?
我知道com就是这样做的,但不想用com

你说得是不是显式调用和隐式调用(),这两种方式的调用都是调用动态连接库(*.dll),只要对外输出的接口不改变,exe程序就不用重新编译的。
只有静态连接库(*.lib)或目标文件(*.obj)才需要重新编译。
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-14 10:56
导出一个类(可以称为接口类),里面的成员是你真正需要导出的类的指针,这样不管你怎么改变类,需要导出的接口类不会变,这样行不行?好像COM也是这种思想
我不仅要金子,我还要点石成金的手指!
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-14 10:56
[quote]能详细一些吗?

我们想在dll中声明一个类
然后用loadlibrary 载入后生成类的实例,
这样方便点,不用重新编译exe.

不知道有什么更进一步的方法?
我知道com就是这样做的,但不想用com

你说得是不是显式调用和隐式调用(),这两种方式的调用都是调用动态连接库(*.dll),只要对外输出的接口不改变,exe程序就不用重新编译的。
只有静态连接库(*.lib)或目标文件(*.obj)才需要重新编译。 [/quote]
他说的就是lib
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
OneWind
驱动小牛
驱动小牛
  • 注册日期2002-05-15
  • 最后登录2009-04-10
  • 粉丝0
  • 关注0
  • 积分82分
  • 威望11点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-14 10:59
    没有用dll导出过类,如果是接口规划的好,改动时应该没必要重新编译exe。
    另外做一些标准的exe模块,在主程序中创建进程,加以调用,由进程去完成需要的功能,感觉也挺不错。不知道大侠们感觉怎样?
嘿,大家好!
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-14 11:47
态玄了点。 :(
[color=red]大头鬼! :P[/color]
minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-14 13:04
只用过VC做DLL导出类,而且导出的类只有VC/VB才能识别。COM可以导出你又不想用。
愿意学习,虽然已经不做APP了。
少了e,就少了全部
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-14 17:47
想想微软的user32.dll/kenerl32.dll/gdi32.dll等WIN32 API库。我们的程序在98/2000等不同的系统同样运行,为什么?接口一样,但是内部实现不一样,哪里需要重新编译exe呢?
我觉得,好好规划dll接口比什么“动态加载动态库中的c++类”来得简单明了。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-15 20:04
nod
 :D :D :D
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
w8zz
驱动小牛
驱动小牛
  • 注册日期2001-12-12
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2002-11-18 11:04
 :(
才注意到用的是BCB~~~
 :D
 
小熊和二申公豹 [img]http://www.driverdevelop.com/forum/upload/w8zz/2003-08-11_黑爸.jpg[/img] 二哥,三娃儿,快帮忙!
akiy
驱动牛犊
驱动牛犊
  • 注册日期2002-09-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-19 02:23
考虑利用插件技术
世贸大厦不是我炸的
mmcall
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2013-04-08
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望5点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-11-20 13:38
这个问题并不复杂,解决方案:

有一类MyClass需导出

dll端:
在dll内声明一个导出函数NewObj:
extern \"C\" __declspec(dllexport) void __stdcall NewObj(void** ppObj);

实现:
void __stdcall NewObj(void** ppObj)
{
    MyClass* pObj=new MyClass();
    *ppObj=pObj;
}

调用端:
包含MyClass的头文件

H文件内再声明一个调用函数

typedef void __declspec(dllimport) MyDLLClass(void **);

MyClass * pDLLClass;

CPP文件:

HINSTANCE hInstTopdll;
hInstTopdll=LoadLibrary(\"......\");

MyDLLClass *Load1;

Load1 = (MyDLLClass *)GetProcAddress(hInstTopdll, \"NewObj\");

if (Load1)
   Load1((void**)&pDLLClass);

这时,就可用MyClass的指针pDLLClass了.
    
附:可以用在BCB;或者用VC做dll,BCB来调(很好用的).




[编辑 -  11/20/02 by  mmcall]
游客

返回顶部