独自のアプリケーションを製品の最新リリースで実行するには、AutoCAD ActiveX API に加えられた変更に基づいて、そのアプリケーションを変更する必要があります。
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 から派生されたクラス(たとえば、AcSmSheetSet、AcSmSheetMgr など)は、64 ビット VBA マイグレーションがあることを予期していません。そのようなプロセスは、VB.NET. に移植することをお勧めします。
現在、Microsoft は開発者用に VBA のネイティブ 64 ビット版を提供しています。したがって、VBA プロジェクトの 2 つのバージョン、32 ビットと 64 ビットを保持する必要があります。AutoCAD 2014 より前のリリースでは、VBA は、既存の 32 ビット VBA プロジェクトを AutoCAD 64 ビットで予期したように動作させるための 32 ビットから 64 ビットへの「変換」レイヤを使用してアクセスされる外部プロセス コンポーネントとして実行されていました。VBA 64 ビットは、フォームに異なるライブラリおよびコントロールを使用する必要があります。すべての VBA ライブラリとフォーム コントロールが 64 ビットで使用できるとは限らず、Windows 32 ビットと Windows 64 ビットで正常に機能するように、コードの一部を調整する必要がある可能性があります。
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 が返され、使用されます。
次に、32 ビット オブジェクト ID の移植コードの例を示します。
Dim splineObj As AcadSpline Dim objectID As Long objectID = splineObj.objectID32 Dim tempObj As AcadObject Set tempObj = ThisDrawing.ObjectIdToObject32(objectID)
Dim splineObj As AcadSpline Dim objectID As Long objectID = splineObj.objectID Dim tempObj As AcadObject Set tempObj = ThisDrawing.ObjectIdToObject(objectID)
VBA アプリケーションは、オブジェクト 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)
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 を指定します。 |