【问题标题】:Cannot create ActiveX component.Error while using GetObject in autocad 2011无法创建 ActiveX 组件。在 AutoCAD 2011 中使用 GetObject 时出错
【发布时间】:2013-11-18 09:07:14
【问题描述】:

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

【问题讨论】:

  • 基本检查表是 1:AutoCad 真的安装了吗? 2:您的程序是否以与 AutoCad 匹配的正确位数运行? 3:SysInternal 的 ProcMon 告诉你什么?
  • 1) Autocad 在我的机器上正常运行。我已经用 VB6 编写了相同的代码。它工作正常。 Kingly 解释 2 和 3 清单。
  • @HansPassant 在他的第二点中谈论的是 32 位与 64 位,在您收到错误之后,这是接下来要查看的逻辑步骤。您导入到 Visual Studio 项目中的库,包含 AcadApplication,您是从 AutoDesk 的 ObjectArx 获得的吗?您需要确保根据项目的位数导入 64 位或 32 位版本的互操作库(Autodesk.AutoCAD.Interop.dll、AutoDesk.AutoCAD.Interop.Common.dll)。

标签: vb.net autocad


【解决方案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 可能是解决此问题的更好方法。

【讨论】:

  • 另外,对于 AutoCAD 2011,我认为它应该是“AutoCAD.Application.18.1”。参考这里作为指南:en.wikipedia.org/wiki/AutoCAD
  • 谢谢Locke。我尝试了你建议的解决方案,但它显示异常。添加到我的查询中请检查。
  • 检查互操作库的正确位数,如我上面的评论中所示。但在尝试将其转换为 AcadApplication 之前,还要查看是否获得了有效的 COM 对象。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2011-07-24
    • 2013-04-27
    • 2010-12-25
    相关资源
    最近更新 更多