x_qingh 发表于 2010-9-11 17:23:00

用C#开发AutoCAD2004不能获取AcadApplication

<p><font face="Verdana">在用C#进行AutoCAD二开发的时候,对2002以及2005以后的版本都能正常获取AcadApplication;</font></p><font face="Verdana">
<p><font face="Verdana">AcadApplication _application = (AcadApplication)System.Runtime.InteropServices.Marshal.GetActiveObject("AutoCAD.Application.16");</font></p>
<p>&nbsp;</p></font>
<p><font face="Verdana">但用到2004的时候就出现以下问题:</font></p>
<p>&nbsp;</p>
<p><font face="Verdana">无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“AutoCAD.AcadApplication”。</font></p>
<p><font face="Verdana">此操作失败的原因是对 IID 为“{8E75D910-3D21-11D2-85C4-080009A0C626}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 不支持此接口 (异常来自 HRESULT:0x80004002 (E_NOINTERFACE))。</font></p>
<p>&nbsp;</p>
<p>我看了下CAD的接口,如下</p>
<p><font face="Verdana"><br/>public interface AcadApplication : IAcadApplication, _DAcadApplicationEvents_Event</font></p>
<p>好像是8E75D910-3D21-11D2-85C4-080009A0C626的啊~怎么就不行呢?</p>
<p>&nbsp;</p>
<p><font face="Verdana">请教下各位大大,倒底是什么问题啊?</font></p>

x_qingh 发表于 2010-9-13 10:23:00

没有谁遇到过类似的问题啊?~

sieben 发表于 2010-9-13 17:29:00

<p>GetActiveObject("AutoCAD.Application.16");</p>
<p>改为:GetActiveObject("AutoCAD.Application.16.0");试试</p>
<p>改为:GetActiveObject("AutoCAD.Application");试试</p>

x_qingh 发表于 2010-9-13 17:39:00

<p>谢谢~</p>
<p>不过用GetActiveObject("AutoCAD.Application.16.0");不能得到2004的进程</p>
<p>GetActiveObject("AutoCAD.Application");和GetActiveObject("AutoCAD.Application.16");的效果是一样的~</p>

sieben 发表于 2010-9-14 10:42:00

<p><font face="Verdana">&nbsp;private void button1_Click(object sender, EventArgs e)<br/>&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AcadApplication _AcadApp = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AcadDocument _AcadDoc = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _AcadApp = (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _AcadDoc = _AcadApp.ActiveDocument;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _AcadDoc = _AcadApp.Documents.Add("acadiso.dwt");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (System.Exception ex)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("AutoCAD.Application " + ex.Message);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _AcadApp = new AcadApplication();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _AcadApp.Visible = true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { _AcadDoc = _AcadApp.ActiveDocument; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _AcadDoc = _AcadApp.Documents.Add("acadiso.dwt");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (System.Exception ex)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("AutoCAD.Application " + ex.Message);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (System.Exception ex)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("AutoCAD.Application " + ex.Message);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; }</font></p>
<p>GG?MM?</p>
<p>以上代码在我这里OK的哦!AutoCAD 2004 英文版</p>

caiqs 发表于 2010-9-15 07:22:00

GetActiveObject首先要启动cad2004才可以

x_qingh 发表于 2011-5-4 11:36:30

本帖最后由 x_qingh 于 2011-5-12 15:22 编辑

应该是AutoCAD2002和AutoCAD2004的DLL引用的时候出的问题,这两个版本都安装后,就会在二次开发的时候出现类似的错误提示。最后放弃了2002的。
页: [1]
查看完整版本: 用C#开发AutoCAD2004不能获取AcadApplication