明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3496|回复: 11

arx的com接口编写

[复制链接]
发表于 2013-12-14 19:40:32 | 显示全部楼层 |阅读模式
最近写了一个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;
}
运行结果崩溃


为什么呀?



本帖子中包含更多资源

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

x
发表于 2013-12-14 20:48:48 | 显示全部楼层
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);

改成这样呢?
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForWrite);
发表于 2013-12-14 20:50:12 | 显示全部楼层
还有 你没有使用多线程吧?
 楼主| 发表于 2013-12-15 11:00:58 | 显示全部楼层
没有使用多线程。给成kForWrite也是不行。
发表于 2013-12-15 12:24:40 | 显示全部楼层
有可能当前不存在acdbHostApplicationServices()->workingDatabase();
按提示极大可能在操作一个空指针,断点跟进去看看就知道了
 楼主| 发表于 2013-12-16 18:52:09 | 显示全部楼层
本帖最后由 wxd20130610 于 2013-12-16 18:55 编辑

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

本帖子中包含更多资源

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

x
发表于 2013-12-17 21:09:19 | 显示全部楼层
楼主:

本帖子中包含更多资源

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

x
发表于 2013-12-18 14:45:57 | 显示全部楼层
文件解锁试试
发表于 2013-12-19 17:02:53 | 显示全部楼层
明显,你的做法就是错误的,你用的是vc++的方法,而不是com
什么是com呢?就是cad提供的一个接口嘛

获取程序,获取文档,获取数据库,这套组合拳都还没有,怎么就说用com了呢?
发表于 2013-12-19 17:28:22 | 显示全部楼层
本帖最后由 luowy 于 2013-12-19 17:33 编辑
  1. <div class="blockcode"><blockquote>void addLine()
  2. {
  3.         AutoCAD::IAcadApplication *pAcApplication = NULL;
  4.         AutoCAD::IAcadDocument *pAcActiveDOc = NULL;
  5. AutoCAD::IAcadDatabase *pAcDb = NULL;
  6. AutoCAD::IAcadModelSpace *pAcMs = NULL;

  7.         HRESULT hr = NOERROR;
  8.         LPUNKNOWN lpUnk = NULL;

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

  12.         if ( FAILED(hr) )
  13.         {
  14.                 acutPrintf( _T("failed to query application") );
  15.                 return;
  16.         }
  17.         pAcApplication->put_Visible( TRUE );
  18.         pAc....->get_ActiveDocument(&pAcActiveDoc)
  19. pDoc->get_modalspace(&pAcMs);
  20. pAcMs->addLine()
复制代码
注意一下,这些东西看上去是不是狠眼熟呢?
看下图

这个图,表达了com接口的来龙去脉,楼主还是太年轻拉

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-18 10:39 , Processed in 0.283599 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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