【问题标题】:How to get access to specific instance of AutoCAD application via C# external application如何通过 C# 外部应用程序访问 AutoCAD 应用程序的特定实例
【发布时间】:2013-07-25 04:58:19
【问题描述】:

我正在尝试通过其 COM 接口与 C# 外部应用程序获取有关 AutoCAD 2007 的所有运行实例的信息(列出已打开文档的全名)。代码如下:

…
using AutoCAD = Autodesk.AutoCAD.Interop;
using System.Runtime.InteropServices.ComTypes;
…
[DllImport("ole32.dll")]
extern static IntPtr CreateBindCtx(IntPtr reserved, out IBindCtx ppbc);
…
static void ListACADDocs()
{
    IntPtr HRESULT;
    IBindCtx objCtx = null;

    HRESULT = CreateBindCtx(new IntPtr(0), out objCtx);

    IRunningObjectTable objRot = null;
    objCtx.GetRunningObjectTable(out objRot);

    IEnumMoniker RunningMonikers = null;
    objRot.EnumRunning(out RunningMonikers);

    RunningMonikers.Reset();

    IntPtr pointerFetchedMonikers = IntPtr.Zero;
    IMoniker[] monikerContainer = new IMoniker[1];
    String strDisplayName;

    Object COMObject = null;
    List<Object> colACADInstances = new List<Object>();

    while (RunningMonikers.Next(1, monikerContainer, pointerFetchedMonikers) == 0)
    {
        monikerContainer[0].GetDisplayName(objCtx, null, out strDisplayName);
        objRot.GetObject(monikerContainer[0], out COMObject);

        //AutoCAD.Application.17 class ID: {28B7AA99-C0F9-4C47-995E-8A8D729603A1}

        if (strDisplayName == "!{28B7AA99-C0F9-4C47-995E-8A8D729603A1}")
            colACADInstances.Add(COMObject);
    }

    foreach (Object obj in colACADInstances)
        foreach(AutoCAD.AcadDocument doc in
            ((AutoCAD.AcadApplication)obj).Documents)
            Console.WriteLine(doc.FullName);
}

结果,它会找到对应于所有 ACAD 运行实例的正确数量的名字对象,但仅从“最早”实例中检索文档名称。看起来所有名字对象都引用单个 AutoCAD.AcadApplication 对象。有没有办法为每个实例做到这一点?

【问题讨论】:

    标签: c# com autocad


    【解决方案1】:

    无论如何,AutoCAD 只会在运行对象表中注册一次,因此沿着这条路走下去将一事无成。几年前我在同一个地方,甚至与 Kean Walmsley 展开了讨论。他向我指出了一种技术,该技术需要从 VBA 的每个 AutoCAD 会话内部运行对自定义服务的伪注册,然后让您的 .NET 应用程序查看该自定义注册。邋遢?确实。但是,如果您真的需要让它发挥作用,这个概念是合理的。

    【讨论】:

    • 非常感谢,洛克。似乎创建这样一个“钩子”是目前唯一的选择。
    【解决方案2】:

    这是“繁重”程序(如 AutoCAD)的典型行为。 MS Word 是另一个例子。它们是单实例应用程序。如果您已经运行了 AutoCAD,那么在您第二次启动它时,它会将命令行传递给第一个实例,要求它打开文档。然后退出。

    所以实际上只有一个进程,它打开了多个文档。使用 Taskmgr.exe,进程选项卡来验证这一点。

    【讨论】:

    • 我已经做到了。进程数与实例数相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2023-02-24
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多