BCB写DLL要注意的事项

1. 如果用到VCL要格外小心。例如使用TStringList来传值,在主程序new一个TStringList,传到dll里面的函数fill(TStringList *lst),fill()对其进行赋值操作,如Add(),Clear()等等。注意,这里就会出错的了,如果是Add操作,当DLL被释放之后,在主程序访问TStringList的元素就会出现AV错误;当执行Clear()操作时,如果在主程序里面曾经执行过Add操作的话,也会出现AV错误。

分析其原因,估计是Add操作后所传入的AnsiString是属于各主领域的内存范围,例如在主程序Add("test")的话,那"test"这个字符串是存在于主程序的内存区域里面,如果在DLL里面执行Delete或者Clear的话,就等于从DLL里面操作主程序的内存。我想,这样跨领域操作内存就会引起内核的保护性操作,故此弹出AV错误。这也就是为什么会出现共享内存访问以及HOOK技术的使用了。

 

2. 如果在DLL里面启用了CodeGuard,可能会引起莫名的错误。这个错误这样是在主程序关闭的时候弹出AV错误及CPU窗口,然后提示有一个地址(范围是属于该DLL的)引起保护性错误。查来查去,程序都没有错误。但如果关闭了一些内存操作语句如strcpy等等,用于在DLL内赋值的语句则正常。其实整个程序都是没有问题的,只要把CodeGuard关闭,重新Build一下(注意,开启/关闭CG,一定要重新Build,Make也不行的! )问题解决。

 

这是近段时间在开发项目中发现的一些细节问题,希望能给大家一些提示

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值