wxd20130610 发表于 2013-10-9 16:58:32

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

#include "stdafx.h"
#include "commom.h"
#include ".\commom.h"
#include "stdlib.h"
#include "dbid.h"

void test()
{
    AcDbEntity   *pObj;
    AcDbEntity   *pObj1;
    AcDbViewport   *pvObj;
    AcDbObjectIdobjId,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();//关闭指针


}
以上是代码,运行到判断实体类型的时候老是崩溃,不知道怎么回事,还望高手解决!多谢了。

wwwliuyu 发表于 2013-10-9 18:41:40

你的代码太不严谨了,对象有没选到也不判断,对象能否打开也不判断,试下以读打开不要写打开对象。

风树 发表于 2013-10-9 20:49:05

调试时断点跟踪一下,应该是acdbOpenObject失败,还有将 AcDbEntity   *pObj、 AcDbEntity   *pObj1、AcDbViewport   *pvObj初始化为空,养成习惯;特别通过acdbOpenObject获得对象指针后一定要加判断语句,看看是否成功。

wxd20130610 发表于 2013-10-9 20:58:53

嗯,谢谢wwwliuyu和风树,确实是这样的问题,我代码修改了一下,但是还是有问题,我发现只要是以写的方式打开块表或对象都会出错,这可不太好。
    Acad::ErrorStatus es = Acad::eOk;
    AcDbEntity   *pObj=NULL;
    AcDbEntity   *pObj1=NULL;
    AcDbViewport   *pvObj=NULL;
    AcDbObjectIdobjId,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;
        }

wwwliuyu 发表于 2013-10-9 21:07:39

已以读打开,怎么还能再写打开!
页: [1]
查看完整版本: 【求助】pObj1->isA()->name()老是崩溃