1

我正在使用下面的代码来使用 AutoCAD 对象。

Dim acadapp As AcadApplication

acadapp = GetObject(, "AutoCAD.Application")

'''并使用以下代码创建对象 -------------

acadapp = CreateObject("AutoCAD.Application")

收到错误“无法创建 ActiveX 组件”。我尝试使用 18,19 和各种组合如下:

acadapp = GetObject(, "AutoCAD.Application.18")

但没有任何工作。请帮忙。

@Locke:感谢您的回复。我尝试了您的解决方案,如下所示:

Dim acadType As Type

Try
   acadapp =   
   System.Runtime.InteropServices.Marshal.GetActiveObject("AutoCAD.Application.18.1")
   ''Above code din't worked so tried below code also
    ' acadapp = DirectCast(Marshal.GetActiveObject("AutoCAD.Application.18.1"), 
    'AcadApplication)

Catch ex As Exception           
  acadType = Type.GetTypeFromProgID("AutoCAD.Application")
  acadapp = DirectCast(Activator.CreateInstance(acadType, True), AcadApplication)           
End Try

显示异常:

无法将“System.__ComObject”类型的 COM 对象转换为接口类型“AutoCAD.AcadApplication”。此操作失败,因为 IID 为“{8E75D910-3D21-11D2-85C4-080009A0C626}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE)) .

4

2 回答 2

1

这是我在处理 AutoCAD 互操作时通常使用的。它检查正在运行的实例,并在必要时创建一个新实例:

private static AcadApplication GetAcadApp(string progId)
{
    // Create the return application
    AcadApplication returnApp = null;

    try
    {
        // Try getting a running instance
        returnApp = (AcadApplication)Marshal.GetActiveObject(progId);
    }
    catch (COMException)
    {
        try
        {
            // Try creating a new instance
            Type acadType = Type.GetTypeFromProgID(progId);
            returnApp = (AcadApplication)Activator.CreateInstance(acadType, true);
        }
        catch (COMException)
        {
            // Report failure
            MessageBox.Show(string.Format("Cannot create object of type \"{0}\"", progId));
        }
    }

    // Return the application
    return returnApp;
}

AcadApplication COM 对象可以这样设置:

// Get/create an AutoCAD instance
var acadApp = getAcadApp("AutoCAD.Application.18");

无论是 C# 还是 VB.NET,使用 Marshal.GetActiveObject 和 Activator.CreateInstance 可能是解决此问题的更好方法。

于 2013-10-07T14:33:58.910 回答
1

根据异常,问题不在于 GetActiveObject() 调用,而是返回的对象不支持您正在寻找的接口。最可能的原因是您的代码引用的 AcadApplication 版本与您从 GetActiveObject() 返回的版本不同。更改您的项目以引用返回的 AutoCAD 实例的 COM 库版本,它应该可以正常工作。

于 2013-11-18T01:07:14.810 回答