ARX二次开发中使用DAO方式访问数据库,导致AutoCAD2004及以上版本退出时报错的解决方法
来源:互联网 发布:ubuntu chroot 编辑:程序博客网 时间:2024/06/06 05:30
使用ObjectARX对AutoCAD进行二次开发,当使用DAO方式访问数据库时,会导致AutoCAD2004及以上版本退出时报错,解决方法如下:
在UnloadApplication()函数未尾(处理case AcRx::kUnloadAppMsg时调用)添加如下代码即可:
void UnloadApplication()
{
// NOTE: DO NOT edit the following lines.
//{{AFX_ARX_EXIT
//}}AFX_ARX_EXIT
//! DAO导致CAD2004退出报错解决方法
AfxDaoTerm(); //!< Un-initialize DAO here...
_AFX_DAO_STATE *&pDaoState = AfxGetModuleState()->m_pDaoState;
delete (CNoTrackObject*)pDaoState; //!< destructor virtual
pDaoState = NULL; //!< Set MFCs DAO to NULL, so it won't try to cleanup later.
}
{
// NOTE: DO NOT edit the following lines.
//{{AFX_ARX_EXIT
//}}AFX_ARX_EXIT
//! DAO导致CAD2004退出报错解决方法
AfxDaoTerm(); //!< Un-initialize DAO here...
_AFX_DAO_STATE *&pDaoState = AfxGetModuleState()->m_pDaoState;
delete (CNoTrackObject*)pDaoState; //!< destructor virtual
pDaoState = NULL; //!< Set MFCs DAO to NULL, so it won't try to cleanup later.
}
原理说明:
MSDN中说到,在APP中调用DAO时MFC会自动销毁DAO对象,但在DLL中要手动AfxDaoTerm();
因为ARX是一个DLL,其中所用的各种DLL是和AutoCAD公用的,如果你在自己的ARX模块中初始化了Dao (在7.0中DAO会自动调用AfxDaoInit (),因此没有必要手动初始化),那么一个虚表就产生了,然而指向Dao的AFX_MODULE_STATE结构的指针也已经存在,当ARX卸载的时候,将会Delete这个虚表,这个时机是先于AutoCAD的MFC的清理工作的,所以MFC在尝试delete内部已经初始化的dao结构时,这个结构不存在了,所以就Crash掉了。
注:
如果程序访问的是Access2000或以上版本的数据库,需要在InitApplication()函数中(处理case AcRx::kInitAppMsg时调用)添加如下代码:
void InitApplication()
{
// NOTE: DO NOT edit the following lines.
//{{AFX_ARX_INIT
//}}AFX_ARX_INIT
//! 使DAO能访问高版本的MDB数据库
AfxGetModuleState()->m_dwVersion = 0x0601;
}
{
// NOTE: DO NOT edit the following lines.
//{{AFX_ARX_INIT
//}}AFX_ARX_INIT
//! 使DAO能访问高版本的MDB数据库
AfxGetModuleState()->m_dwVersion = 0x0601;
}
0 0
- ARX二次开发中使用DAO方式访问数据库,导致AutoCAD2004及以上版本退出时报错的解决方法
- ARX二次开发中使用DAO方式访问数据库,导致AutoCAD2004及以上版本退出时报错的解决方法
- ARX二次开发中使用DAO方式访问数据库,导致AutoCAD2004及以上版本退出时报错的解决方法
- 数据库版本不同导致还原时报错
- 关于Xcode 6 以上版本CocoaPods可以安装但使用时报错的解决办法
- 程序退出时使用WaitForSingleObject导致程序阻塞的原因及解决方法
- 关于Android4.4及以下版本,TextView中使用矢量图时报错的问题
- solr4.4以上版本安装及安装过程中出现的错误解决方法
- arx 。net二次开发中DBObject类型转换的问题。
- axis2(1.4及以上版本) wsdl2java 使用方式
- eclipse中使用alt+/查看提示时报错的解决方法
- SQL Server 2008还原数据时报错“因为数据库正在使用,所以无法获得对数据库的独占访问权”的解决方法
- iOS10及以上版本的通知授权方式
- 成功将log4cpp升级到了vs2005版本,总结下编译时报错及相应的解决方法
- Xcode7 及以上版本中使用HTTP请求
- Xcode7及以上版本中使用后http请求
- springmvc框架的项目,如何在controller中使用dao访问数据库
- 2005及以上版本在操纵语句中使用output可以获取具体的影响信息
- C:\Users\Administrator\Desktop\频道录音\子涵打造.mp3\
- CocoaPods安装和使用教程
- 实现self.view的整体上移
- 支持向量机(三)核函数
- query for a List<String> using DBUtils
- ARX二次开发中使用DAO方式访问数据库,导致AutoCAD2004及以上版本退出时报错的解决方法
- 转换函数本身
- 第8周项目3(2)-分段函数计算
- 分数与小数的转换
- 支持向量机(四)
- 延迟一段时间调用SendMessage发送Windows消息
- java 1220
- Android开发MVP模式实践
- Android设计模式系列(2)--SDK源码之观察者模式