软件结构设计的问题(VCL组件的继承结构)

子正 2008-07-04 04:37:43
现在遇到两个与软件结构设计有关的麻烦:

1.有一部分公用的代码是写在一个静态库中的.使用中发现,.lib只能被有继承或者使用关系的组件引用一次.用例子说明吧.
1)XXXCommon.lib中有函数Trace(char *fmt, ...);函数.
2)在XXXStateObj中需要使用Trace,这时候,需要把XXXCommon.lib链接进来.
3)XXXCommDev使用了XXXStateObj,但是它也需要打印测试代码,但是此时,已经无法再把XXXCommon.lib链接进来了.编译通不过.

2.如何暴露一个类?我现在的做法是把类的所有代码都写在一个头文件里,在需要的地方包含进来.


其实问题只有一个.
怎样在设计VCL组件时,将公共的部分独立出来? 我希望最好是形成一个.dll 或者是 .lib
因为这部分代码也需要独立的复用.


谢谢!
...全文
67 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
子正 2008-07-14
  • 打赏
  • 举报
回复
最后采用了统一为BPL包的形式,
但是即使这样做,仍然出现了很多编译错误.
在排错的时候发现,BCB处理组件间引用的方式并不那么智能.
手工排除了一些废弃的依赖项后,搞定了(有的甚至是重新建立了工程)
子正 2008-07-08
  • 打赏
  • 举报
回复
原理是什么?
为什么lib不可以,dll可以.

bpl可以我似乎能理解.vcl控件间的引用关系似乎是系统自动维护的.
但是lib 和 dll没有本质差别啊.

还有,做lib的时候,我没有对函数声明进行任何修饰.
比如加上个dll_export之类的东西.
正确的函数导出\导入语法是什么?

BCB本身自带的c库就是以lib方式提供的吧,它可以,我也应该可以.
ps:昨天已经实验过,似乎可以同时在两个相互关联的类中同时引用一个函数库的代码.
似乎是把库(My.lib)放在以下地方就可以(不需要放在所有的地方)

<PROJECT>
<MACROS>
<LIBRARIES value="My.lib"/>
<SPARELIBS value="rtl.lib vcl.lib MaxinCommObj.lib MaxinStateObj.lib dbrtl.lib vcldb.lib My.lib"/>
</MACROS>
<LINKER>
<ALLOBJ value="c0pkg32.obj $(PACKAGES) Memmgr.Lib My.lib sysinit.obj $(OBJFILES)"/>
<ALLRES value="$(RESFILES)"/>
<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib My.lib"/>
<OTHERFILES value=""/>
</LINKER>
</PROJECT>

勉励前行 2008-07-07
  • 打赏
  • 举报
回复
如果你做成BPL , 確實會有問題1。如果是EXE,問題1該不存在。

将公共的部分独立出来,要分散在不同的BPL組件中,那麼就不要用LIB,而用DLL或BPL,這樣就可以。
子正 2008-07-07
  • 打赏
  • 举报
回复
就是把*.lib相关的头文件包含进来,还需要把*.lib添加进工程.
XXXCommDev的出错信息似乎是说,*.lib对应的代码也变成了一个类似组件的东西,已经加入了XXXStateObj.

所以,看来这涉及头文件的定义,我必须把*.lib部分的函数声明做些处理.
  • 打赏
  • 举报
回复
)XXXCommDev使用了XXXStateObj,但是它也需要打印测试代码,但是此时,已经无法再把XXXCommon.lib链接进来了.编译通不过.
按理说XXXStateObj中已经包含了XXXCommon.lib,不需要再包含一次。只需要包含头文件。
能不能说清楚XXXStateObj是怎么编译的?

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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