ARX二次开发中使用DAO方式访问数据库,导致AutoCAD2004及以上版本退出时报错的解决方法
2007-01-06 10:23
846 查看
使用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.
}
原理说明:
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;
}
感谢:CAD开发(79573391)、无所谓(357167753)等网友提供的帮助!
在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.
}
原理说明:
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;
}
感谢:CAD开发(79573391)、无所谓(357167753)等网友提供的帮助!
相关文章推荐
- ARX二次开发中使用DAO方式访问数据库,导致AutoCAD2004及以上版本退出时报错的解决方法
- ARX二次开发中使用DAO方式访问数据库,导致AutoCAD2004及以上版本退出时报错的解决方法
- Spring+Hibernate DAO 持久层开发, Spring 用 Hibernate 访问数据库的三种方法.推荐使用回调
- Spring+Hibernate DAO 持久层开发, Spring 用 Hibernate 访问数据库的三种方法.推荐使用回调
- 使用SQL Server发布数据库快照遇到错误:对路径“xxxxx”访问被拒绝的解决方法
- 使用浏览器wpf应用程序时访问数据库需要报权限错误的解决方法
- 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- 还原数据库出现“因为数据库正在使用,所以无法获得对数据库的独占访问权”解决方法
- Chrome58以上版本Goagent访问google显示不安全使用问题解决
- sql2008 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- 使用DotNetNuke(DNN) Startkit 4.7(及以上版本)安装无法完成问题的解决方法
- 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- SQL Server 2008 “因为数据库正在使用,所以无法获得对数据库的独占访问权”解决方法
- SQL Server 2008 “因为数据库正在使用,所以无法获得对数据库的独占访问权”解决方法
- 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- 使用SQL Server发布数据库快照遇到错误:对路径”xxxxx“访问被拒绝的解决方法
- 使用SQL Server发布数据库快照遇到错误:对路径”xxxxx“访问被拒绝的解决方法
- 关于使用NotificationComat导致android2.3及以下版本无法显示自定义布局的解决方法.