[讨论]ObjectARX调试问题大搜集
众所周知,用VC开发的程序调试起来比较困难,再加上ARX中的一些操作,有时候调试一个问题需要耗费大量的时间。这个帖子的想法是大家把自己在调程序中遇到的问题和解决方案汇集在这里,给后来的人启示,让大家都少走弯路。不管是菜鸟还是高手,都希望大家留下自己的经验和教训,拒绝灌水和潜水者。
1>------ 已启动生成: 项目: CAD_QRCodeARX_2008_VC8, 配置: Debug Win32 ------
1>正在编译...
1>AutoMenu.cpp
1>Building debug version of curveText.dbx to be used with non-debug/Prod AutoCAD
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(59) : error C2653: “AutoCAD”: 不是类或命名空间名称
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(59) : error C2065: “IAcadApplication”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(59) : error C2065: “pAcad”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(60) : error C2653: “AutoCAD”: 不是类或命名空间名称
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(60) : error C2065: “IAcadMenuBar”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(60) : error C2065: “pMenuBar”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(61) : error C2653: “AutoCAD”: 不是类或命名空间名称
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(61) : error C2065: “IAcadMenuGroups”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(61) : error C2065: “pMenuGroups”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(62) : error C2653: “AutoCAD”: 不是类或命名空间名称
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(62) : error C2065: “IAcadMenuGroup”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(62) : error C2065: “pMenuGroup”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(63) : error C2653: “AutoCAD”: 不是类或命名空间名称
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(63) : error C2065: “IAcadPopupMenus”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(63) : error C2065: “pPopUpMenus”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(64) : error C2653: “AutoCAD”: 不是类或命名空间名称
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(64) : error C2065: “IAcadPopupMenu”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(64) : error C2065: “pPopUpMenu”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(65) : error C2653: “AutoCAD”: 不是类或命名空间名称
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(65) : error C2065: “IAcadPopupMenuItem”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(65) : error C2065: “pPopUpMenuItem”: 未声明的标识符
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(96) : error C2653: “AutoCAD”: 不是类或命名空间名称
1>d:\1-cad_qrcode_arx\cad_qrcodearx\cad_qrcodearx_2004\automenu.cpp(96) : error C2065: “IID_IAcadApplication”: 未声明的标识符 不错,值得一看 我认为开发中常见的有下面几个错误:
1、忘记关闭数据库中的对象,这是最为常见的一个错误。在下面的情况下都需要关闭对象:
(1)创建新对象并添加到数据库中,或者使用符号表和符号表记录。这在最基本的创建实体程序中可以看到。
(2)使用acdbOpenObject、acdbOpenAcDbEntity和<SPAN class=H1Overlay title="acdbOpenAcDbObject Global Function">acdbOpenAcDbObject 函数打开一个对象之后。</SPAN>
<SPAN class=H1Overlay title="acdbOpenAcDbObject Global Function"> (3)使用遍历器遍历数据库对象(非数据库对象,例如遍历文档就不需要关闭)之后。</SPAN>
<SPAN class=H1Overlay title="acdbOpenAcDbObject Global Function">2、数组越界。这是VC中的一个基本错误,在ARX开发中同样经常遇到。不过可以使用MFC的安全数组CArray或者ARX中对应的AcArray来代替。</SPAN>
<SPAN class=H1Overlay title="acdbOpenAcDbObject Global Function">3、没有释放内存。一般来说用VC编程,用new分配一块内存就需要用delete释放,但是在ARX中有时候就不是用delete。最明显的例子就是结果缓冲区(struct resbuf)和选择集(ads_name)的使用,分别用acedRelRb()和acedSSFree()函数来释放内存。</SPAN> 对於ARX的实体对象,如果加入了数据库,你就close,否则delete!切记. 好多错误都是可以通过BOUND CHECK检查出来的,当然好的编程习惯是最好的。到最后发布的时候应该DEBUG调试一下,找出内存或者资源泄漏的地方修改! 1.
warning C4311: 'type cast' : pointer truncation from 'const AcDbStub *' to 'unsigned long'
2.
rxapi.lib(libinit.obj) : warning LNK4099: PDB 'msvc.pdb' was not found with 'C:\ObjectARX 2004\lib\rxapi.lib' or at 'c:\FoxPress\Debug\msvc.pdb'; linking object as if no debug info<BR>acedapi.lib(acedstub.obj) : warning LNK4099: PDB 'corehdr.pdb' was not found with 'C:\ObjectARX 2004\lib\acedapi.lib' or at 'c:\FoxPress\Debug\corehdr.pdb'; linking object as if no debug info<BR>acedapi.lib(acedcls.obj) : warning LNK4099: PDB 'corehdr.pdb' was not found with 'C:\ObjectARX 2004\lib\acedapi.lib' or at 'c:\FoxPress\Debug\corehdr.pdb'; linking object as if no debug info
来几个做程序常见的warning吧,大家看看怎么消除??<BR> 我安装的VC中的调试窗口的下级菜单总是灰色的,调不出来,为什么呢???还有有的程序编译能通过,可是在CAD下运行的时候又经常提示发生异常错误,然后自动关闭了CAD,是什么原因呢 我觉得arx调试除了vc编译慢,加载arx要时间外,调试不比lisp难啊,
arx 内存泄漏 数组越界 只要改变变成习惯可以较好避免 (我不用数组 用carray,总会判断长度,也就是没有越界问题了)
对应的 lisp 函数多了,如果不小心没有把 i 这样的简单常用变量设置为局部变量,就 有全局变量干扰问题,这个问题才叫痛苦。
人们常说arx容易导致acad崩溃 其实误传, 导致acad崩溃基本上都是是打开的东西没有关闭导致的,一般这样的问题调试的时候会发现。
倒是有的头文件的包含问题很麻烦 :我自己生成了lib文件, ,使用了某个arx全局函数,编译通过,
在引用这个lib的时候会说没个某个函数没有链接, 但我虽然引用这个lib,却没有使用这个函数,就算我使用了,前面编译lib的时候却不报告错误,不奇怪。 本帖最后由 作者 于 2005-1-20 21:56:14 编辑 <br /><br /> AcDbRegion::createFromCurves(curveSegments,regions)......regions的内存要释放<BR>