2

C# 外部アプリケーションとの COM インターフェイスを介して、実行中の 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 オブジェクトを参照しているようです。すべてのインスタンスに対してそれを行う方法はありますか?

4

2 に答える 2

1

とにかく、AutoCAD は実行中のオブジェクト テーブルに 1 回しか登録しないため、その道をたどってもどこにも行きません。私は数年前にまったく同じ場所にいて、それについて Kean Walmsley と議論を始めました。彼は、VBA の各 AutoCAD セッション内からカスタム サービスへの疑似登録を実行し、.NET アプリケーションがそのカスタム登録を参照する必要がある手法を教えてくれました。ずさんな?絶対。ただし、本当に機能させる必要がある場合、このコンセプトは適切です。

于 2013-07-31T17:54:31.730 に答える
1

これは、AutoCAD などの「重い」プログラムの典型的な動作です。MS Word は別の例です。それらは単一インスタンスのアプリです。すでに AutoCAD を実行している場合は、2 回目に起動すると、コマンド ラインが最初のインスタンスに渡され、ドキュメントを開くように求められます。そして出る。

したがって、実際にはプロセスは 1 つしかなく、複数のドキュメントが開かれています。これを確認するには、Taskmgr.exe の [プロセス] タブを使用します。

于 2013-07-25T12:58:35.837 に答える