明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1170|回复: 4

【求助】pObj1->isA()->name()老是崩溃

[复制链接]
发表于 2013-10-9 16:58:32 | 显示全部楼层 |阅读模式
#include "stdafx.h"
#include "commom.h"
#include ".\commom.h"
#include "stdlib.h"
#include "dbid.h"

void test()
{
    AcDbEntity   *pObj;
    AcDbEntity   *pObj1;
    AcDbViewport   *pvObj;
    AcDbObjectId  objId,objId1;
    ads_name      ename;
    ads_point     pickpt;
        try{
        acedEntSel("\nSelect a polygon: ",ename, pickpt);
        acdbGetObjectId(objId, ename);
        acdbOpenObject(pObj1,objId,AcDb::kForWrite);//打开实体对象,获取实体指针
       
        acutPrintf(pObj1->isA()->name());//运行到此处老是崩溃

        if (strcmp(pObj1->isA()->name(),"AcDbViewport")==0){
                pvObj=(AcDbViewport *)pObj1;
        }
        else{
                acutPrintf("\nnot an Viewport!");
        }       
        pObj1->close();//关闭指针


}
以上是代码,运行到判断实体类型的时候老是崩溃,不知道怎么回事,还望高手解决!多谢了。
发表于 2013-10-9 18:41:40 | 显示全部楼层
你的代码太不严谨了,对象有没选到也不判断,对象能否打开也不判断,试下以读打开不要写打开对象。
发表于 2013-10-9 20:49:05 | 显示全部楼层
调试时断点跟踪一下,应该是acdbOpenObject失败,还有将 AcDbEntity   *pObj、 AcDbEntity   *pObj1、AcDbViewport   *pvObj初始化为空,养成习惯;特别通过acdbOpenObject获得对象指针后一定要加判断语句,看看是否成功。
 楼主| 发表于 2013-10-9 20:58:53 | 显示全部楼层
嗯,谢谢wwwliuyu和风树,确实是这样的问题,我代码修改了一下,但是还是有问题,我发现只要是以写的方式打开块表或对象都会出错,这可不太好。
    Acad::ErrorStatus es = Acad::eOk;
    AcDbEntity   *pObj=NULL;
    AcDbEntity   *pObj1=NULL;
    AcDbViewport   *pvObj=NULL;
    AcDbObjectId  objId,objId1;
    ads_name      ename;
    ads_point     pickpt;
       
        //打开数据库
        AcDbBlockTable *pBlkTbl=NULL;
        es=acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl,AcDb::kForRead);//此处能成功打开
        if (Acad::eOk!=es){
                acutPrintf("打开数据库失败");
                acutPrintf("\n");
                return S_OK;
        }
       
        AcDbBlockTableRecord *pBlockTableRecord;
        es=pBlkTbl->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);//一旦为写的方式打开就打不开数据库,难道没连接到数据库
        if (Acad::eOk!=es){
                acutPrintf("打开模型空间数据库失败");
                acutPrintf("\n");
                pBlkTbl->close();
                return S_OK;
        }
       
        AcDbBlockTableRecord *pBlkTblRec=NULL;
        es=pBlkTbl->getAt(ACDB_PAPER_SPACE, pBlkTblRec, AcDb::kForWrite);//一旦为写的方式打开就打不开数据库
        if (Acad::eOk!=es){
                acutPrintf("打开图纸空间数据库失败");
                acutPrintf("\n");
                pBlkTbl->close();
                return S_OK;
        }
       
        acedEntSel("\nSelect a polygon: ",ename, pickpt);
        acdbGetObjectId(objId, ename);
        if (acdbOpenObject(pObj1,objId,AcDb::kForWrite)!=Acad::eOk)//一旦为写的方式打开就打不开数据库
        {
                acutPrintf("打开视口失败");
                acutPrintf("\n");
                pBlkTblRec->close();
                return S_OK;
        }
发表于 2013-10-9 21:07:39 | 显示全部楼层
已以读打开,怎么还能再写打开!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 06:59 , Processed in 0.159916 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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