概要 - ActiveX API を使用した VBA プロジェクトおよび他のアプリケーションをマイグレートする(VBA/ActiveX)

独自のアプリケーションを製品の最新リリースで実行するには、AutoCAD ActiveX API に加えられた変更に基づいて、そのアプリケーションを変更する必要があります。

VBA での AutoCAD オブジェクトのインスタンス化

64 ビット オペレーティング システムは、32 ビット アプリケーションと 64 ビット アプリケーションの両方を実行することができます。しかし、同じプロセス内で両方を混在させることはできません。たとえば、64 ビット プロセスで 32 ビット DLL をロードすることはできません。その逆も同じです。プロセスにロードされるすべての実行可能コンポーネント(EXE および DLL ファイル)は、プロセスのバイナリ タイプと一致していなければなりません。64 ビット アプリケーションの In-process コンポーネントは、可能な限り 64 ビット プロセスに移植する必要があります。

新しいオブジェクトを作成しようとすると、エラーが発生する可能性があります。VB の New キーワードは、64 ビット AutoCAD COM DLL をロードしようとします。VBA は 32 ビット アプリケーションなので、64 ビット DLL をロードすることはできません。たとえば、次のようなコードがあるとします。

Dim color As AcadAcCmColor
Set color = New AcadAcCmColor

または

Dim color As New AcadAcCmColor
color.SomeMethod()

これらのコードは、次のように修正して移植する必要があります。

Dim color As AcadAcCmColor
Set color = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.20")

上の問題は、IDispatch から派生されたすべてのオブジェクトに対して AcadApplication.GetInterfaceObject("ProgIdOfAcAnyObject") を使用することによって解決できます。IUnknown から派生されたクラス(たとえば、AcSmSheetSetAcSmSheetMgr など)は、64 ビット VBA マイグレーションがあることを予期していません。そのようなプロセスは、VB.NET. に移植することをお勧めします。

64 ビット マイグレーション

現在、Microsoft は開発者用に VBA のネイティブ 64 ビット版を提供しています。したがって、VBA プロジェクトの 2 つのバージョン、32 ビットと 64 ビットを保持する必要があります。AutoCAD 2014 より前のリリースでは、VBA は、既存の 32 ビット VBA プロジェクトを AutoCAD 64 ビットで予期したように動作させるための 32 ビットから 64 ビットへの「変換」レイヤを使用してアクセスされる外部プロセス コンポーネントとして実行されていました。VBA 64 ビットは、フォームに異なるライブラリおよびコントロールを使用する必要があります。すべての VBA ライブラリとフォーム コントロールが 64 ビットで使用できるとは限らず、Windows 32 ビットと Windows 64 ビットで正常に機能するように、コードの一部を調整する必要がある可能性があります。

オブジェクト ID を処理する

AutoCAD 2009 の 64 ビット版から AutoCAD 2013 の 64 ビット版まで、オブジェクト ID は 64 ビット整数型(__int64)で表現されます。これらの値に 32 ビット VBA でアクセスすると、コンパイル エラーが発生します。この解決策として、旧メソッド名の後ろに "32" を付け加えた新しいメソッド名(たとえば、ObjectID32()OwnerID32())を使用します。これらのメソッドは、内部的に 64 ビット整数型に変換される LONG 型を使用します。

正確に言うと、VBA が必要とする各オブジェクト ID に対して、32 ビット オブジェクト ID が内部的に作成されます。この ID は、実際の 64 ビット ID に対応付けられており、VBA コードから AutoCAD に 32 ビット ID が返された場合、内部的には 64 ビット オブジェクト ID が返され、使用されます。

注: オブジェクト ID は、AutoCAD 32 ビット版の LONG データ型には変換されなくなりました。

次に、32 ビット オブジェクト ID の移植コードの例を示します。

元のコード 64 ビット(AutoCAD 2009 から AutoCAD 2013 まで)
Dim splineObj As AcadSpline
Dim objectID As Long
objectID = splineObj.objectID32
Dim tempObj As AcadObject
Set tempObj = ThisDrawing.ObjectIdToObject32(objectID)
AutoCAD 2014 の 64 ビット版以降の互換に移植したコード
Dim splineObj As AcadSpline
Dim objectID As Long
objectID = splineObj.objectID
Dim tempObj As AcadObject
Set tempObj = ThisDrawing.ObjectIdToObject(objectID)

VBA アプリケーションは、オブジェクト ID ではなく、オブジェクトのハンドルを使用することもできます。次の例に、オブジェクト ID の代わりにハンドルを使用する方法を示します。

オブジェクトのオブジェクト ID を使用した元のコード
Dim splineObj As AcadSpline
Dim objectID As Long
objectID = splineObj.objectID
Dim tempObj As AcadObject
Set tempObj = ThisDrawing.ObjectIdToObject(objectID)
オブジェクトのハンドルを使用した変更後のコード
Dim splineObj As AcadSpline
Dim objectHandle As String
objectHandle = splineObj.Handle
Dim tempObj As AcadObject
Set tempObj = ThisDrawing.HandleToObject(objectHandle)

付録 - 32 ビットのメソッド(AutoCAD 2014 の 64 ビット版で廃止)

注: オブジェクト ID は、AutoCAD 32 ビット版の LONG データ型には変換されなくなりました。

AutoCAD 2009 の 64 ビット版から AutoCAD 2013 の 64 ビット版で 32 ビットの代わりに使用されたメソッドの一覧を次の表に示します。

64 ビット システムの VBA メソッド
メソッド - AutoCAD 2009 から 2013 メソッド - AutoCAD 2014 以降 使用法
GetBlockAttributeValue32 GetBlockAttributeValue 32 ビット オブジェクト ID を使用して、ブロックに含まれる属性定義オブジェクトの指定したブロック セルの属性値を返します。
GetBlockTableRecordId32 GetBlockTableRecordId ブロックタイプ セルと nContent に関連付けられたブロック テーブル レコードの 32 ビット オブジェクト ID を取得します。
GetFieldId32 GetFieldId 指定したセルに関連付けられたフィールド オブジェクトの 32 ビット オブジェクト ID を返します。
GetGridLinetype32 GetGridLinetype グリッド線種オブジェクトの 32 ビット オブジェクト ID を返します。
Key32 キー 64 ビット システムに対する CopyObjects 操作で、ソース オブジェクトのオブジェクト ID を指定します。
ObjectID32 ObjectID 64 ビット システムのオブジェクト ID を取得します。
ObjectIDtoObject32 ObjectIDtoObject 64 ビット システムの指定したオブジェクト ID に対応するオブジェクトを取得します。
OwnerID32 OwnerID 64 ビット システムのオーナー(親)オブジェクトのオブジェクト ID を取得します。
SetBlockAttributeValue32 SetBlockAttributeValue 32 ビット オブジェクト ID を使用して、ブロックと nContent を含む属性定義オブジェクトの指定したブロック セルの属性値を設定します。
GetBlockTableRecordId32 SetBlockTableRecordId ブロックタイプ セルと nContent に関連付けられた 32 ビット オブジェクト ID ブロック テーブル レコードを設定します。
SetFieldId32 SetFieldId 指定したセルと nContent に関連付けられたフィールド オブジェクトの 32 ビット オブジェクト ID を設定します。
SetGridLinetype32 SetGridLinetype グリッド線種オブジェクトの 32 ビット オブジェクト ID を設定します。
Value32 64 ビット システムに対する、プロパティの現在値、または新しく作成されたクローン オブジェクトのオブジェクト ID を指定します。