ARX二次开发中使用DAO方式访问数据库,导致AutoCAD2004及以上版本退出时报错的解决方法

使用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;

}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fpgzs2/archive/2007/01/06/1475415.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值