您的位置:首页 > 其它

BCB写DLL要注意的事项

2009-06-16 10:33 176 查看
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也不行的!

)问题解决。

这是近段时间在开发项目中发现的一些细节问题,希望能给大家一些提示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: