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 呼び出しが次のエラーのために失敗したため、この操作は失敗しました: No such interface supported (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() 呼び出しではなく、返されたオブジェクトが探しているインターフェイスをサポートしていないことです。最も可能性の高い理由は、GetActiveObject() から返されるものとは異なるバージョンの AcadApplication をコードが参照していることです。返された AutoCAD インスタンスの COM ライブラリ バージョンを参照するようにプロジェクトを変更すると、正常に動作するはずです。

于 2013-11-18T01:07:14.810 に答える