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也不行的!
)问题解决。
这是近段时间在开发项目中发现的一些细节问题,希望能给大家一些提示
分析其原因,估计是Add操作后所传入的AnsiString是属于各主领域的内存范围,例如在主程序Add("test")的话,那"test"这个字符串是存在于主程序的内存区域里面,如果在DLL里面执行Delete或者Clear的话,就等于从DLL里面操作主程序的内存。我想,这样跨领域操作内存就会引起内核的保护性操作,故此弹出AV错误。这也就是为什么会出现共享内存访问以及HOOK技术的使用了。
2. 如果在DLL里面启用了CodeGuard,可能会引起莫名的错误。这个错误这样是在主程序关闭的时候弹出AV错误及CPU窗口,然后提示有一个地址(范围是属于该DLL的)引起保护性错误。查来查去,程序都没有错误。但如果关闭了一些内存操作语句如strcpy等等,用于在DLL内赋值的语句则正常。其实整个程序都是没有问题的,只要把CodeGuard关闭,重新Build一下(注意,开启/关闭CG,一定要重新Build,Make也不行的!
)问题解决。
这是近段时间在开发项目中发现的一些细节问题,希望能给大家一些提示
相关文章推荐
- ActiveX控件中加载BCB编写的dll的注意事项
- 关于在c#里加载c++ dll的一些注意事项
- 包含别人的dll,然后我们用类库再次封装成dll的时候的注意事项;源文件与模块生成时的文件不同;创建调试信息文件 ··PDB时发生意外的错误,进程无法访问文件,因为另一个程序正在使用此文件
- string浅拷贝及其在dll中运用的注意事项
- VC中DLL工程创建注意事项
- C# 调用带有复杂参数的C++ ,delphi dll 注意事项备注。(C++ dll 怎么回调C# 程序,参数怎么写?)
- 收藏:偶要用delphi写几个dll来公开发布出去,让其他工具的程序员调用。应该注意些什么事项 关键字:分类 :个人专区密级 :公开
- string浅拷贝及其在dll中运用的注意事项
- ASP封装成DLL一些注意事项
- DELPHI中调用DLL的方法和一些注意事项和技巧
- 在 DLL工程中加入新 CFormView时的 注意事项
- Qt Creator调用VS2008生成的DLL注意事项 good
- VC中DLL导出函数时注意事项
- BCB调用dll文件中注意的问题
- MagicAjax 使用及注意事项~!!!AJAX无刷新的DLL文件!!
- Delphi 关于DLL中使用TThread类或其子类的使用注意事项
- string浅拷贝及其在dll中运用的注意事项
- DELPHI中调用DLL的方法和一些注意事项和技巧
- PHP连接SQLSERVER 注意事项(附dll文件下载)
- ASP封装成DLL一些注意事项- -