Long
数据类型没有死
我读到由于Long
变量声明,某些宏可能无法正常工作。
您可能指的是使用API 函数(API - 应用程序编程接口)您必须照顾不同的环境。这些系统函数确实需要
指向→句柄或 →内存位置的指针LongPtr
类型(注意特殊前缀!)。PtrSafe
我的问题如下:在 excel365 中我怎么可能仍然可以使用普通的 Long 变量?
与引用的 API 函数相反, VBA 过程不会被迫“禁止”Long
变量的数据类型,就像您被迫不这样做一样少Integer
(尽管顺便说一句,VBA 在内部更喜欢Long
整数)。
LongPtr
声明的进一步说明
由于窗口句柄LongPtr
在Office 2010或更高版本中以及Long
在之前的版本中声明,因此有必要
通过条件编译常量( .. ) 来区分不同版本,例如#If VBA7 Then
#End If
#If VBA7 Then ' Office 2010 or higher
Private Declare PtrSafe Function FindWindow Lib "User32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) _
As LongPtr
#Else
Private Declare Function FindWindow Lib "User32" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
#End If
请注意,某些 API 函数还需要使用条件Win64
常量来识别实际安装的 64 位 Office 系统;我已经提到,Office 经常默认安装为 32 位。
LongPtr
, 但是不是真正的数据类型,因为它会根据实际的 32/64 位环境转换为正确的数据类型。
请注意,64 位系统可以安装为 32 位办公室或 64 位办公室。
LongPtr
允许编写可在 32 位和 64 位环境中运行的可移植代码。
提示:注意通过适当的数据类型声明分配的 API 变量。如果您通过条件编译常量来区分版本,您也必须在自己的过程中使用引用变量。
相关链接
进一步推荐阅读 (谢谢@GSerg :-)
在以下帖子中引用@GSerg:
“通过将 PtrSafe 添加到函数声明中,您向编译器承诺您已将 LongPtr 放在它需要的所有地方,而不是其他任何地方。”
“LongPtr 是一个指针大小的整数。它必须用于与指针大小相同的东西。”
“Long 存在于所有版本中,并且在所有版本中都意味着相同的东西(32 位整数)。你不应该为了它而将它更改为 LongPtr。你应该只将 LongPtr 用于指针或指针大小的数据类型。”