Vba declare语句的ptrSafe属性的用途是什么

Vba declare语句的ptrSafe属性的用途是什么,vba,32bit-64bit,Vba,32bit 64bit,在VBA中,如果我在64位办公环境中使用函数,我需要在DLL中用ptrSafe属性声明一个函数 就我所见,ptrSafe在技术上没有任何改变,因此我不确定ptrSafe属性的实际用途。ptrSafe用于告诉VBA API声明是安全的:Ptr(指针)safe(安全,安全) 此属性表示我们的目标是64位版本 例如 以ShellExecuteAPI函数为例,它在默认应用程序中打开任何文件,而不知道它。例如,一个.xlsx文档将在Excel中打开,一个.pdf文档将在Acrobat Reader中打开,

在VBA中,如果我在64位办公环境中使用函数,我需要在DLL中用
ptrSafe
属性声明一个函数


就我所见,
ptrSafe
在技术上没有任何改变,因此我不确定
ptrSafe
属性的实际用途。

ptrSafe
用于告诉VBA API声明是安全的:
Ptr(指针)
safe(安全,安全)

此属性表示我们的目标是64位版本

例如

ShellExecute
API函数为例,它在默认应用程序中打开任何文件,而不知道它。例如,一个.xlsx文档将在Excel中打开,一个.pdf文档将在Acrobat Reader中打开,除非您安装了另一个pdf阅读器(如Sumatra pdf)


此函数的API声明已更改为
64位
版本。要使
32位和64位版本共存于同一数据库中,请编写以下代码:

' --- DECLARATION API WINDOWS
#If VBA7 Then
  Private Declare PtrSafe Function ShellExecute _
    Lib "shell32.dll" _
    Alias "ShellExecuteA" ( _
      ByVal hwnd As LongPtr, ByVal lpOperation As String, _
      ByVal lpFile As String, ByVal lpParameters As String, _
      ByVal lpDirectory As String, ByVal nShowCmd As Long) _
    As LongPtr
#Else
  Private Declare Function ShellExecute _
    Lib "shell32.dll" _
    Alias "ShellExecuteA" ( _
      ByVal hwnd As Long, ByVal lpOperation As String, _
      ByVal lpFile As String, ByVal lpParameters As String, _
      ByVal lpDirectory As String, ByVal nShowCmd As Long) _
    As Long
#End If

“此函数的API声明已更改为64位版本”--这并不准确。使用VBA7语法意味着声明可以在32位或64位版本中运行。它不会爆炸,因为
LongPtr
可缩放为32位或64位整数,而
Long
LongLong
不会根据硬件进行缩放。事实上,您的示例的VBA7版本运行于32位或64位Office;只有较旧的VBA6主机(例如Office 2007和更早版本)将运行第二个非指针安全版本,因为那里不存在
LongPtr
ptrSafe
意味着可以在64位平台上执行声明。这并不能让电话更安全。它与64位版本的Excel一起出现,以防止旧代码在64位Excel上运行。