阅读:1951回复:16
大家讨论一下软件模块化的途径 (BCB环境)
大家讨论一下软件模块化的途径
我们要开发一个软件,以前是所有模块都写在一起,也就是全用源码的综合来实现一个软件,发现很多问题。 现在想用dll技术来实现。把每一个独立的模块都用dll来实现。一些功能简单的可以直接导出函数就行了。但我想在 dll里面导出类,并想采用动态加载.如果是静态加载的话, 这不成任何问题,但这样一来,如果dll修改了一些,那exe也要重新编译,真的很烦。但我们不想用 com来实现,调起来麻烦。 有什么办法来动态加载动态库中的c++类? 开发工具 bcb6 vcl库 |
|
最新喜欢:ytoneb...
|
沙发#
发布于:2002-11-14 10:07
1,“动态加载动态库中的c++类”?没明白
2,“并想采用动态加载.如果是静态加载的话, 这不成任何问题,但这样一来,如果dll修改了一些,那exe也要重新编译”,静态和动态有本质区别吗?为何“如果dll修改了一些,那exe也要重新编译”?只要DLL导出的东西没变,exe就不用修改! 3,500分?哄抬物价啊。现在这里已经通货膨胀了 :( |
|
|
板凳#
发布于:2002-11-14 10:17
调用动态连接库的时候,想办法让应用程序随时能够知道被调用函数的所在模块,这样,让连接器方便的知道在应用程序中添加必要的信息(即所谓的引入库),使应用程序能够随时找到北调用函数所再的动态连接库即库文件的位置。
|
|
|
地板#
发布于:2002-11-14 10:20
我以前的活儿也有类似的~~~99年的事儿~~
最后我们不怕烦~dll一变,全部工程也重作~~ 要导出c++类的dll我们也是静态连接的~~ 这样就不太出问题了~~~~ 当然动态连接也可以~~~ 但像那个c++类的动态new实例却没做过~~~ 但你导出dll一个函数,这个函数就是为了动态new实例 最后返回实例指针就可以了~~当然你的host app的工程 要包含那个特定c++类的头文件~~~至少也得是那个c++类 的基类说明头文件 大家讨论一下软件模块化的途径 |
|
|
地下室#
发布于:2002-11-14 10:23
那么基类不变~~~你的host app也不用重编了~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :( 给点分吧~~~~ :( |
|
|
5楼#
发布于:2002-11-14 10:23
能详细一些吗?
我们想在dll中声明一个类 然后用loadlibrary 载入后生成类的实例, 这样方便点,不用重新编译exe. 不知道有什么更进一步的方法? 我知道com就是这样做的,但不想用com |
|
|
6楼#
发布于:2002-11-14 10:37
能详细一些吗? 你说得是不是显式调用和隐式调用(),这两种方式的调用都是调用动态连接库(*.dll),只要对外输出的接口不改变,exe程序就不用重新编译的。 只有静态连接库(*.lib)或目标文件(*.obj)才需要重新编译。 |
|
7楼#
发布于:2002-11-14 10:56
导出一个类(可以称为接口类),里面的成员是你真正需要导出的类的指针,这样不管你怎么改变类,需要导出的接口类不会变,这样行不行?好像COM也是这种思想
|
|
|
8楼#
发布于:2002-11-14 10:56
[quote]能详细一些吗? 你说得是不是显式调用和隐式调用(),这两种方式的调用都是调用动态连接库(*.dll),只要对外输出的接口不改变,exe程序就不用重新编译的。 只有静态连接库(*.lib)或目标文件(*.obj)才需要重新编译。 [/quote] 他说的就是lib |
|
|
9楼#
发布于:2002-11-14 10:59
没有用dll导出过类,如果是接口规划的好,改动时应该没必要重新编译exe。
另外做一些标准的exe模块,在主程序中创建进程,加以调用,由进程去完成需要的功能,感觉也挺不错。不知道大侠们感觉怎样? |
|
|
10楼#
发布于:2002-11-14 11:47
态玄了点。 :(
|
|
|
11楼#
发布于:2002-11-14 13:04
只用过VC做DLL导出类,而且导出的类只有VC/VB才能识别。COM可以导出你又不想用。
愿意学习,虽然已经不做APP了。 |
|
|
12楼#
发布于:2002-11-14 17:47
想想微软的user32.dll/kenerl32.dll/gdi32.dll等WIN32 API库。我们的程序在98/2000等不同的系统同样运行,为什么?接口一样,但是内部实现不一样,哪里需要重新编译exe呢?
我觉得,好好规划dll接口比什么“动态加载动态库中的c++类”来得简单明了。 |
|
|
13楼#
发布于:2002-11-15 20:04
nod
:D :D :D |
|
|
14楼#
发布于:2002-11-18 11:04
:(
才注意到用的是BCB~~~ :D |
|
|
15楼#
发布于:2002-11-19 02:23
考虑利用插件技术
|
|
|
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] |
|