找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 903|回复: 8

[求助]:为何该段代码会导致AutoCAD非正常中止

[复制链接]
发表于 2005-9-16 10:09:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
cpp文件见附件
我是在.NET2002下用objectARX Project建立的程序
功能是在当前绘图上pick点,将获得的点坐标存在SQL Server数据库的同时,将pick的点在指定的层"Layer_Frame"上顺序连线

该段代码编译通过,且在ARX中加载能够实现预期功能
但是在退出时,无论选择“是”或“否”保存,都会弹出一个
fatal error对话框,导致AutoCAD非正常关闭(但是关闭前能保存所做的修改)

因为我没有很好的C++基础,ARX也只学了1个多月,这个程序算是一点学习成果,所以请大虾帮我看一下这段代码
个人认为可能是在打开块表时出现了问题

请赐教
谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-9-19 18:39:51 | 显示全部楼层
因为没有币也没有时间所以不能下载你的附件
我认为有可能是内存释放的问题,用C/C++编程最容易出现的问题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-19 18:56:56 | 显示全部楼层
//功能:在当前绘图上pick点,将获得的点坐标存在SQL Server数据库的同时,将pick的点顺序连线
//editor:fxm
//date:2005年9月16日
//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "MyDlg.h"

CString xpt[100];
CString ypt[100];
float xco[100];
float yco[100];
//-----------------------------------------------------------------------------
#define szRDS _RXST("lemon")

//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CPickPointApp : public AcRxArxApp {

public:
        CPickPointApp () : AcRxArxApp () {}

        virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
                AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
                // TODO: Add your initialization code here

                return (retCode) ;
        }

        virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
                AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
                // TODO: Add your code here

                return (retCode) ;
        }

        virtual void RegisterServerComponents () {
        }


        // ----- lemonPickPoint.pp command (do not rename)
        static void lemonPickPointpp(void)
        {
                // Add your code for command lemonPickPoint.pp here
               
                ads_point pt;
                int NodeNumCount;  //定义节点数,即最大的节点编号数值
                acedGetInt("Please input the node number:",&NodeNumCount);
                for(int i=0;i<NodeNumCount;i++)
                {
                    if(acedGetPoint(NULL,"\nPick a point:",pt)==RTNORM)
                    {
                         xpt.Format("%g",pt[X]);
                         ypt.Format("%g",pt[Y]);
                         acutPrintf("\nThe coordinates of the point is:%s,%s",xpt,ypt);
                    }
                }

                _ConnectionPtr m_pConnection;
                AfxOleInit();
        HRESULT hr;
       
                hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
                if(SUCCEEDED(hr))
                {
                    hr = m_pConnection->Open("Provider=SQLOLEDB;Data Source=CZQDAY;User ID=sa;Password=820306;Initial Catalog=TOSHIBA1","","",adModeUnknown);///连接数据库
                }
      
            try
                {  
            _variant_t varProjectID,varID,varx,vary;
            for(int i=0;i<NodeNumCount;i++)               
                        {
                                atof(xpt);
                                atof(ypt);
                                varProjectID = "as001";
                                varID = i+1;
                            varx = xpt;
                            vary = ypt;
                            _RecordsetPtr t_pRecordset;
                                t_pRecordset.CreateInstance("ADODB.Recordset");
                        t_pRecordset->Open("SELECT * FROM xy",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
                        t_pRecordset->MoveFirst();
                                t_pRecordset->AddNew();
                        t_pRecordset->PutCollect("ProjectID",varProjectID);
                        t_pRecordset->PutCollect("id",varID);
                            t_pRecordset->PutCollect("x",varx);
                                t_pRecordset->PutCollect("y",vary);
                        t_pRecordset->Update();//只有写了这句才能刷新数据库!!
                       
                                //Refresh();//只有运行这个函数,才能保存成功
                                t_pRecordset->Close();       
                        }
        }
        catch(_com_error e)///捕捉异常
            {
                    AfxMessageBox("保存不成功!");///显示错误信息
            }

                //更改数据类型,CString->float
                for (int j=0;j<NodeNumCount;j++)
                {
                        xco[j]=atof(xpt[j]);
                        yco[j]=atof(ypt[j]);
                }

                //pick点,连续画直线
                AcDbBlockTableRecord *pBlkTableRcd
                        =new AcDbBlockTableRecord();//创建块表记录
                //以写方式得到当前块表的指针
                AcDbBlockTable *pBlkTable=NULL;       
                acdbHostApplicationServices()->workingDatabase()
                        ->getSymbolTable(pBlkTable, AcDb::kForWrite);
        //将新的块表记录加入块表中,并获得块表记录的ID
                AcDbObjectId Id;
                pBlkTable->add(Id, pBlkTableRcd);
                pBlkTable->close();

        for(int k=0;k<NodeNumCount;k++)
                {
                        //生成直线
                    AcGePoint3d startPt(xco[k],yco[k],0.0);//定义直线起点
            AcGePoint3d endPt(xco[k+1],yco[k+1],0.0);//定义直线终点
                        AcDbLine *pLine=new AcDbLine(startPt,endPt);
                    AcDbBlockTable *pBlkTable2=NULL;
            acdbHostApplicationServices()->workingDatabase()
                ->getSymbolTable(pBlkTable2, AcDb::kForRead);

            pBlkTable2->getAt(ACDB_MODEL_SPACE, pBlkTableRcd,
                AcDb::kForWrite);
                        pBlkTable2->close();

            AcDbObjectId lineId;
            pBlkTableRcd->appendAcDbEntity(lineId, pLine);
            pLine->setLayer("Layer_Frame");//设置创建轮廓线的层为"Layer_Frame"
                        pLine->close();
                }
                pBlkTableRcd->close();


        }

        // ----- lemonPickPoint.verify command (do not rename)
        static void lemonPickPointverify(void)
        {
                // Add your code for command lemonPickPoint.verify here
                CMyDlg dlg;
                dlg.DoModal();
        }
} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CPickPointApp)

ACED_ARXCOMMAND_ENTRY_AUTO(CPickPointApp, lemonPickPoint, pp, pp, ACRX_CMD_TRANSPARENT, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CPickPointApp, lemonPickPoint, verify, verify, ACRX_CMD_TRANSPARENT, NULL)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-20 09:23:59 | 显示全部楼层
最初由 littlecong 发布
[B]因为没有币也没有时间所以不能下载你的附件
我认为有可能是内存释放的问题,用C/C++编程最容易出现的问题 [/B]


不好意思,我没有设置收取爱心币,不知为什么系统还是认为要币

不过这个文件的代码3楼已经贴出来了,请帮我研究一下

谢谢3楼
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-20 11:03:02 | 显示全部楼层
我也正在研究这个问题!希望有经验的多多指教
其中非正常退出的提示如下:


                               
登录/注册后可看大图
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-20 16:39:27 | 显示全部楼层
1、你的这种循环的写法很不好:
for(int k=0;k {
//生成直线

2、pBlkTable2->getAt(ACDB_MODEL_SPACE, pBlkTableRcd,AcDb::kForWrite);
这里你以写的方法打开,所以之前要把文件锁起来,完成后解锁。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-20 20:32:27 | 显示全部楼层
终于来高手了,多谢您指出错误。屏闭了几行代码,错误得到改正!
希望能帮楼主解决问题!
ads_point pt;
int NodeNumCount;  //定义节点数,即最大的节点编号数值

acedGetInt("请输入多边形顶点数:",&NodeNumCount);
if(acedGetPoint(NULL,"\n请选择起始点:",pt)==RTNORM)
{
        xpt[0].Format("%g",pt[X]);
        ypt[0].Format("%g",pt[Y]);
        acutPrintf("\n起始点坐标为:%s,%s",xpt[0],ypt[0]);
}
xco[0]=atof(xpt[0]);
yco[0]=atof(ypt[0]);
for(int i=0;i<NodeNumCount;i++)
{
        if(acedGetPoint(NULL,"\n拾取下一点:",pt)==RTNORM)
        {
                xpt[i+1].Format("%g",pt[X]);
                ypt[i+1].Format("%g",pt[Y]);
                acutPrintf("\n该点坐标为:%s,%s",xpt[i+1],ypt[i+1]);
        }
        xco[i+1]=atof(xpt[i+1]);
        yco[i+1]=atof(ypt[i+1]);
        //pick点,连续画直线
        /*AcDbBlockTableRecord *pBlkTableRcd
                =new AcDbBlockTableRecord();//创建块表记录
        //以写方式得到当前块表的指针
        AcDbBlockTable *pBlkTable=NULL;
        acdbHostApplicationServices()->workingDatabase()
                ->getSymbolTable(pBlkTable, AcDb::kForRead);
        //将新的块表记录加入块表中,并获得块表记录的ID
        AcDbObjectId Id;
        pBlkTable->add(Id, pBlkTableRcd);
        pBlkTable->close();*/
        //生成直线
        AcGePoint3d startPt(xco,yco,0.0);//定义直线起点
        AcGePoint3d endPt(xco[i+1],yco[i+1],0.0);//定义直线终点
        AcDbLine *pLine=new AcDbLine(startPt,endPt);
        AcDbBlockTable *pBlkTable2;
        acdbHostApplicationServices()->workingDatabase()
                ->getSymbolTable(pBlkTable2, AcDb::kForRead);
       
AcDbBlockTableRecord *pBlockTableRecord;//

        pBlkTable2->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
                AcDb::kForWrite);
        pBlkTable2->close();
       
        AcDbObjectId lineId=AcDbObjectId::kNull;
        pBlockTableRecord->appendAcDbEntity(lineId, pLine);
        //pBlkTableRcd->appendAcDbEntity(lineId, pLine);
        //        pLine->setLayer("Layer_Frame");//设置创建轮廓线的层为"Layer_Frame"
       
//        pBlkTableRcd->close();
        pBlockTableRecord->close();
        pLine->close();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-20 22:27:15 | 显示全部楼层
哈哈,终于能够正常运行了
xlgis真是好人,总能解决我的困难
也多谢6楼的启发

修改后的代码我就我不贴上来了
改的地方基本上与7楼的差不多
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-23 09:53:55 | 显示全部楼层
被你的代码折腾的不行了  改了下  省的用强制转换了
AcGePoint3d  pt[512];
int ret;//
        acedGetInt("\n请输入多边形顶点数:",&NodeNumCount);
        ret=acedGetPoint(NULL,"\n请选择起始点:",asDblArray(pt[0]));
for (int=1;i<NodeNumCount;i++)  

{
acedGetPoint(asDblArray(pt[i-1]),"\n拾取下一点:",asDblArray(pt));
                AcDbLine *pLine=new AcDbLine(pt[i-1],pt);
                AcDbBlockTable *pBlkTable2;
                acdbHostApplicationServices()->workingDatabase()
                        ->getSymbolTable(pBlkTable2, AcDb::kForRead);
               
                AcDbBlockTableRecord *pBlockTableRecord;//
               
                pBlkTable2->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
                        AcDb::kForWrite);
                pBlkTable2->close();
               
                AcDbObjectId lineId=AcDbObjectId::kNull;
                pBlockTableRecord->appendAcDbEntity(lineId, pLine);
                pBlockTableRecord->close();
                pLine->close();
        }

上面的 for (int=1;i
<
NodeNumCount;i++)  总改不了  注意一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 13:35 , Processed in 0.599710 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表