| 关于迁移自动化项目 (VBA/ActiveX) 通常,在 VBA IDE 中创建或使用 Visual Studio 创建的 AutoCAD 自动化项目可能需要一些更新,然后才能在 AutoCAD 2022 中使用。 有关对 ActiveX API 所做的更改的一般历史记录,请参阅“ActiveX API 历史记录”。 
ActiveX 库引用可能需要在 AutoCAD 图形环境或其他支持 VBA 的应用程序(如 Microsoft Word 或 Excel)中创建的 VBA 项目中更新对 AutoCAD ActiveX API 的引用。使用 AutoCAD ActiveX API 的托管 .NET 和 ObjectARX 应用程序可能还需要更新。 下表列出了基于 AutoCAD 的产品版本支持的 AutoCAD 对象库的文件名。 
| 释放 | 版本号 | AutoCAD 类型库 | AutoCAD/ObjectDBX 类型库 |  
| AutoCAD 2022版本 | R24.1 | acax24<language>.tlb | axdb24<language>.tlb |  
| AutoCAD 2021版 | 24.0 | acax24<language>.tlb | axdb24<language>.tlb |  
| AutoCAD 2020版 | 23.1 | acax23<语言>.tlb | axdb23<language>.tlb |  
| AutoCAD 2019版 | 23.0 | acax23<语言>.tlb | axdb23<language>.tlb |  
| AutoCAD 2018版 | 22.0 | acax22<language>.tlb | axdb22<language>.tlb |  
| AutoCAD 2017版 | 21.0 | acax21<language>.tlb | axdb21<language>.tlb |  
| AutoCAD 2016版 | 20.1 | acax20<语言>.tlb | axdb20<language>.tlb |  
| AutoCAD 2015版 | 20.0 | acax20<语言>.tlb | axdb20<language>.tlb |  
| AutoCAD 2014版 | 19.1 | acax19<language>.tlb | axdb19<language>.tlb |  
| AutoCAD 2013版 | 19.0 | acax19<language>.tlb | axdb19<language>.tlb |  
| AutoCAD 2012版 | 18.2 | acax18<语言>.tlb | axdb18<language>.tlb |  
| AutoCAD 2011版 | 18.1 | acax18<语言>.tlb | axdb18<language>.tlb |  
| AutoCAD 2010版 | 18.0 | acax18<语言>.tlb | axdb18<language>.tlb |  
| AutoCAD 2009版 | 17.2 | acax17<语言>.tlb | axdb17<language>.tlb |  
| AutoCAD 2008版 | 17.1 | acax17<语言>.tlb | axdb17<language>.tlb |  
| AutoCAD 2007版 | 17.0 | acax17<语言>.tlb | axdb17<language>.tlb |  
| AutoCAD 2006版 | 16.2 | acax16<language>.tlb | axdb16<language>.tlb |  
| AutoCAD 2005版 | 16.1 | acax16<language>.tlb | axdb16<language>.tlb |  
| AutoCAD 2004版 | 16.0 | acax16<language>.tlb | axdb16<language>.tlb |  
| AutoCAD 2002版 | 15.2 | acax15.tlb | axdb15.tlb |  
| AutoCAD 2000i的 | 15.1 | acax15.tlb | axdb15.tlb |  
| AutoCAD 2000的 | 15.0 | acax15.tlb | axdb15.tlb |  
注意:<language>表示对象库的语言。例如,<language> 在英语装置上可能是 enu,在法语装置上可能是 fra。 下面列出了早期版本使用的其他 AutoCAD ActiveX API 的文件名,以及已将其替换为最新版本的对象库文件: 
acETransmit17.tlb 到 acETransmit19.tlb – 更改为 acETransmit20.tlb 
		  
AcSmComponents17.tlb 到 AcSmComponents23.tlb – 更改为 AcSmComponents24.tlb 
		  
cao16<language>.tlb – 更改为 cao20<language>.tlb 
		   
最新版本中的新对象和更改对象
新对象 
				未添加任何新对象。更改的对象 
				下表描述了对现有对象所做的更改。 
| AutoCAD 2021版 | AutoCAD 2022版本 | 变更说明 |  
| AutoCAD.Application.24或AutoCAD.Application.24.0 
							  | AutoCAD.Application.24或AutoCAD.Application.24.1 
							  | 用于基于最新安装的库创建 AutoCAD 应用程序的实例。AutoCAD.Application 如果要确保创建 AutoCAD 2022 实例,请使用 .AutoCAD.Application.24.1 |  
与早期版本相比的一般更改除了更新 COM 库引用之外,可能需要进行以下更改才能从早期版本迁移程序: 
必须修改用于 64 位支持的方法和属性。“64 位迁移”一节概述了这些更改。从基于 AutoCAD 2015 的产品开始,该方法将命令字符串发送到对象并以异步方式执行。VBA 项目的执行将暂停,直到命令字符串执行的最后一个命令完成或终止,并将文档返回到空闲状态。在早期版本中,命令字符串被发送到对象,而不挂起 VBA,您可以使用该方法将值传递给当前命令。SendCommandAcadDocumentAcadDocumentSendCommand例如,在基于 AutoCAD 2014 的产品及更早版本中,以下内容有效: ThisDrawing.SendCommand "._LINE "
ThisDrawing.SendCommand "0,0 5,5 " 在基于AutoCAD 2015的产品及更高版本中,前面的代码将执行LINE命令,然后等待用户提供点。在LINE命令完成或终止后,将执行第二种方法。您可以将前面的代码更改为以下代码以正确执行:SendCommand ThisDrawing.SendCommand "._LINE 0,0 5,5 " 如果需要将代码语句分解为多行,则可以使用将命令字符串发布到对象并同步执行字符串的方法。命令字符串的同步执行是指在执行最外层过程且对象处于空闲状态时执行命令字符串。PostCommandAcadDocumentAcadDocument该方法不再支持为图形指定密码的功能。不再支持密码保护。从方法的参数中删除对象以更新代码语句以在最新版本中使用。SaveAsAcadSecurityParamsvSecurityParamsSaveAs 
64 位迁移从 AutoCAD 2014 开始,AutoCAD 支持提供本机 64 位支持的 VBA 7.1。此更改将要求维护 VBA 项目的两个版本:32 位和 64 位。在 AutoCAD 2014 之前的版本中,VBA 作为进程外组件运行,通过 32 位到 64 位的“thunking”层进行访问,该图层允许现有的 32 位 VBA 项目在 AutoCAD 64 位中按预期运行。 VBA 64 位需要使用不同的库和控件来表示。并非所有 VBA 库和窗体控件都以 64 位提供,您可能需要调整某些代码才能在 Windows 32 位和 Windows 64 位上正常工作。 如果 VBA 项目是针对 AutoCAD 2009 到 AutoCAD 2013 开发的,则在将 VBA 项目移植到最新版本时需要考虑以下事项: 
最初为 Windows 32 位创建的窗体上使用的控件可能需要更新或替换为 64 位替代项,才能在 Windows 64 位上正确执行。专门为允许 VBA 32 位与 AutoCAD 64 位配合使用而创建的方法和特性现已过时,并已被删除。用正确的方法和属性替换过时的方法和属性,通常从方法或属性的名称中删除“32”就足够了。 
处理 ObjectId 
				从 AutoCAD 2009 64 位到 AutoCAD 2013 64 位,对象 ID 由 64 位整数数据类型 () 表示。在 32 位 VBA 中访问这些值会导致编译错误。作为解决方案,创建了一组以“32”为后缀的新方法名称,这些名称与旧方法相对应(例如,)。这些方法使用数据类型,该数据类型在内部映射到 64 位整数数据类型。__int64ObjectID32()OwnerID32()LONG 更准确地说,在内部为 VBA 中所需的每个对象 ID 创建了一个 32 位对象 ID。此 ID 映射到其 64 位实际 ID,因此,如果 32 位 ID 从 VBA 代码传递回 AutoCAD,则可以返回 64 位对象 ID 并在内部用于所有目的。 下面的示例给出了移植的 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。 |  
| 键32 | 钥匙 | 指定 64 位系统操作中源对象的对象 ID。CopyObjects |  
| 对象 ID32 | 对象 ID | 获取 64 位系统的对象 ID。 |  
| ObjectIDtoObject32 | ObjectIDtoObject | 获取对应于 64 位系统的给定对象 ID 的对象。 |  
| 所有者ID32 | 所有者 ID | 获取 64 位系统的所有者(父)对象的对象 ID。 |  
| SetBlockAttributeValue32 | SetBlockAttributeValue | 使用块和 nContent 中包含的属性定义对象的指定块单元格中的属性值设置其 32 位对象 ID。 |  
| SetBlockTableRecordId32 | SetBlockTableRecordId | 设置与块类型单元格和 nContent 关联的 32 位对象 ID 块表记录。 |  
| 设置字段Id32 | SetFieldId | 设置与指定单元格和 nContent 关联的字段对象的 32 位对象 ID。 |  
| SetGridLinetype32 | SetGridLinetype | 设置网格线类型对象的 32 位对象 ID。 |  
| 值32 | 价值 | 指定 64 位系统的属性的当前值或新创建的克隆对象的对象 ID。 |  |