在autocad 2011中使用GetObject时无法创建ActiveX component.Error

时间:2013-10-07 09:51:52

标签: vb.net autocad

我使用下面的代码来使用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))

2 个答案:

答案 0 :(得分: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可能是更好的方法。

答案 1 :(得分:1)

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