wxd20130610 发表于 2013-12-14 19:40:32

arx的com接口编写

最近写了一个arx 的com接口,一共两个函数,一个是想cad命令行输出123,另一个是绘制直线,但第一个可以实现,第二个因为涉及到数据库老是崩溃,不知道为什么?还请高人指点。
第一个函数:STDMETHODIMP CmyCustomCom::Promt(DOUBLE* XX){
      // TODO: 在此添加实现代码
      acutPrintf("123\n");

      return S_OK;
}
可以成功运行
第二个函数
STDMETHODIMP CmyCustomCom::AddLine(DOUBLE* XX)
{
      // TODO: 在此添加实现代码
      AcGePoint3d ptStart(0, 0, 0);
      AcGePoint3d ptEnd(100, 100, 0);
      AcDbLine *pLine = new AcDbLine(ptStart, ptEnd);

      AcDbBlockTable *pBlockTable;
      acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
      AcDbBlockTableRecord *pBlockTableRecord;
      pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
      AcDbObjectId lineId;
      pBlockTableRecord->appendAcDbEntity(lineId, pLine);
      pBlockTable->close();
      pBlockTableRecord->close();
      pLine->close();

      return S_OK;
}
运行结果崩溃


为什么呀?



风树 发表于 2013-12-14 20:48:48

acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);

改成这样呢?
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForWrite);

风树 发表于 2013-12-14 20:50:12

还有 你没有使用多线程吧?

wxd20130610 发表于 2013-12-15 11:00:58

没有使用多线程。给成kForWrite也是不行。

风树 发表于 2013-12-15 12:24:40

有可能当前不存在acdbHostApplicationServices()->workingDatabase();
按提示极大可能在操作一个空指针,断点跟进去看看就知道了

wxd20130610 发表于 2013-12-16 18:52:09

本帖最后由 wxd20130610 于 2013-12-16 18:55 编辑

这个是源文件,开发平台是CAD2006和vs2003.望高手指教。

风树 发表于 2013-12-17 21:09:19

楼主:

haill2000 发表于 2013-12-18 14:45:57

文件解锁试试

luowy 发表于 2013-12-19 17:02:53

明显,你的做法就是错误的,你用的是vc++的方法,而不是com
什么是com呢?就是cad提供的一个接口嘛

获取程序,获取文档,获取数据库,这套组合拳都还没有,怎么就说用com了呢?

luowy 发表于 2013-12-19 17:28:22

本帖最后由 luowy 于 2013-12-19 17:33 编辑

<div class="blockcode"><blockquote>void addLine()
{
      AutoCAD::IAcadApplication *pAcApplication = NULL;
      AutoCAD::IAcadDocument *pAcActiveDOc = NULL;
AutoCAD::IAcadDatabase *pAcDb = NULL;
AutoCAD::IAcadModelSpace *pAcMs = NULL;

      HRESULT hr = NOERROR;
      LPUNKNOWN lpUnk = NULL;

      LPDISPATCH pAcDisp = acedGetIDispatch( TRUE );
      hr = pAcDisp->QueryInterface( AutoCAD::IID_IAcadApplication, (void**) &pAcApplication );
      pAcDisp->Release();

      if ( FAILED(hr) )
      {
                acutPrintf( _T("failed to query application") );
                return;
      }
      pAcApplication->put_Visible( TRUE );
      pAc....->get_ActiveDocument(&pAcActiveDoc)
pDoc->get_modalspace(&pAcMs);
pAcMs->addLine()注意一下,这些东西看上去是不是狠眼熟呢?
看下图

这个图,表达了com接口的来龙去脉,楼主还是太年轻拉
页: [1] 2
查看完整版本: arx的com接口编写