正在进行安全检测...

发布时间:2023-12-02 18:34:11

64VisualBasicforApplications概述
MicrosoftVisualBasicforApplications(VBAMicrosoftOffice附带的VisualBasic版本。MicrosoftOffice2010中,VBA包括可使VBA代码同时在32位和64位环境中正确运行的语言功能。注意:默认情况下,Office2010安装32位版本。在安装过程中,您必须明确选择安装64位版本。对于在Office2010版本之前(VBA版本6和更早版本)编写的VBA代码,需要修改为在64Office版本中运行,否则在64位平台上运行时会导致错误。这是因为,VBA版本6和更早版本完全以32位平台为目标,而且通常包含Declare语句这些语句调用的WindowsAPI使用32位数据类型的指针和句柄。因为VBA版本6和更早版本没有用于指针或句柄的特定数据类型,所以,它使用Long数据类型(一种324字节的数据类型)来引用指针和句柄。64位环境中的指针和句柄为8字节64位数。这些64位数不能包含在32位数据类型中。注意:只有在64位版本的MicrosoftOffice中运行VBA代码时,才需要修改VBA代码。
64Office中运行旧VBA代码的问题在于,将64位加载到32位数据类型中会截断64位数。这会导致内存溢出、代码中出现意外结果,并且可能导致应用程序故障。
为解决此问题,以使VBA代码能同时在32位和64位环境中正确运行,新版VBA中增加了几项语言功能。此文档底部的表总结了这些新的VBA语言功能。有三个重要的新增功能,分别是:LongPtr类型别名、LongLong数据类型和PtrSafe关键字。
LongPtr-现在,VBA包括一种可变类型别名:LongPtrLongPtr
实际解析为哪种数据类型取决于它在哪Office版本中运行:32位版本的OfficeLongPtr解析为Long64位版本的OfficeLongPtr解析为LongLongLongPtr用于指针和句柄。LongLong-LongLong数据类型为有符号的64位整数,仅在64位版本的Office中可用。LongLong
64位整数。必须使用转换函数将LongLong(包括64位平台上的LongPtr)显式赋予较小的整型。不允许将LongLong隐式转换为较小的整数。PtrSafe-PtrSafe关键字声明Declare语句可以在64位版本的Office中安全运行。现在,在64位版本的Office中运行时,所有Declare语句必须都包括PtrSafe关键字。必须理解,仅仅将PtrSafe关键字添加到Declare语句中只是表示Declare语句显式针对64位,而语句中需要存储64位(包括返回值和参数)的所有数据类型仍须经过修改才能保存64位数。
注意带有PtrSafe关键字的Declare语句为建议的语法。包括PtrSafeDeclare语句可同时在32位和64位平台上的VBA7开发环境中正确工作。为确保在VBA7中以及更早版本中的向后兼容性,请使用下面的构造:
#IfVba7ThenDeclarePtrSafeSub...#ElseDeclareSub...#EndIf
请考虑下列Declare语句示例。在64位版本的Office中运行未经修改的Declare语句会导致一个错误,该错误指出Declare语句未包括PtrSafe限定符。修改后的VBA示例中包含PtrSafe限定符,但请注意,返回值(指向活动窗口的一个指针)返回Long数据类型。64Office上,这是错误的,因为指针应为64位。PtrSafe限定符告知编译器Declare语句针对64位,因此该语句可以正常执行。但是返回值没有更新为64位数据类型,因此被截断,从而返回错误的值。

未修改的旧VBADeclare语句示例:DeclareFunctionGetActiveWindowLib"user32"(AsLong
修改后的VBADeclare语句示例,其中包括PtrSafe限定符,但仍使用32位返回值:DeclarePtrSafeFunctionGetActiveWindowLib"user32"(AsLong
再次重申,您除了必须修改Declare语句来包括PtrSafe限定符外,还必须更新语句中所有需要保存64位数的变量,以便这些变量使用64位数据类型。
修改后的VBADeclare语句示例,其中包括PtrSafe关键字,并且更新为使用正确的64(LongPtr数据类型:DeclarePtrSafeFunctionGetActiveWindowLib"user32"(AsLongPtr
总而言之,对于要在64位版本的Office中运行的代码,您需要找到并修改所有现有Declare语句以使用PtrSafe限定符。同时,还需要找到并修改这些Declare语句内所有引用句柄或指针的数据类型以使用新的64兼容的LongPtr类型别名,并且需要使用新的LongLong数据类型保存64位整数的类型。此外,还必须更新任何包含指针或句柄以及64位整数的用户定义类型(UDT,使之使用64位数据类型,同时,必须验证所有变量赋值是否正确,以防止发生类型不匹配错误。
编写可同时在32位和64Office上运行的代码
若要编写可同时在32位和64位版本的Office上运行的代码,只需对所有指针和句柄值使用新的LongPtr型别名来代替LongLongLong即可。LongPtr类型别名将解析为正确的LongLongLong数据类型,具体取决于运行的是哪种Office版本。请注意,如果您需要执行不同的逻辑(例如,您需要在大型MicrosoftExcel目中使用64位值),可以使用Win64条件编译常量,如下面一节所示。
编写可同时在MicrosoftOffice201032位或64位)以及以前版本的Office上运行的代码
若要编写可同时在新版本和旧版本的Office中运行的代码,可以使用新的VBA7Win64条件编译器常量的组合。Vba7条件编译器常量用来判断代码是否在VB编辑器版本7Office2010附带的VBA版本)中运行。Win64条件编译常量用于判断正在运行哪种Office版本(32位还是64位)。#ifVba7then'代码正在新VBA7编辑器中运行#ifWin64then'代码正在64位版本的MicrosoftOffice中运行
#else'代码正在32位版本的MicrosoftOffice中运行#endif#else'代码正在VBA版本6或更早版本中运行#endif

#IfVba7Then

正在进行安全检测...

相关推荐