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;
}
运行结果崩溃
为什么呀?
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
改成这样呢?
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForWrite); 还有 你没有使用多线程吧? 没有使用多线程。给成kForWrite也是不行。 有可能当前不存在acdbHostApplicationServices()->workingDatabase();
按提示极大可能在操作一个空指针,断点跟进去看看就知道了
本帖最后由 wxd20130610 于 2013-12-16 18:55 编辑
这个是源文件,开发平台是CAD2006和vs2003.望高手指教。 楼主:
文件解锁试试 明显,你的做法就是错误的,你用的是vc++的方法,而不是com
什么是com呢?就是cad提供的一个接口嘛
获取程序,获取文档,获取数据库,这套组合拳都还没有,怎么就说用com了呢? 本帖最后由 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