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

【求助】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:00

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

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

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

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

嗯,谢谢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:00

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