[Public | Private] Declare Sub name Lib "libname" [Alias "aliasname"] [([arglist])]
对于函数调用:
[Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type]
我的一个应用程序中的一些示例:
Public Declare Function apiGetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Public Declare Function WM_apiGetDeviceCaps Lib "gdi32" Alias _
"GetDeviceCaps" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Declare Function WM_apiGetDesktopWindow Lib "user32" Alias _
"GetDesktopWindow" () As Long
Declare Function WM_apiGetDC Lib "user32" Alias _
"GetDC" (ByVal hwnd As Long) As Long
Declare Function WM_apiReleaseDC Lib "user32" Alias _
"ReleaseDC" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Declare Function WM_apiGetSystemMetrics Lib "user32" Alias _
"GetSystemMetrics" (ByVal nIndex As Long) As Long
Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long
#If VBA7 Then
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
2 回答
您必须在VBA模块中声明该功能:对于命令:
对于函数调用:
我的一个应用程序中的一些示例:
Edited to Add PtrSafe information: 见MSDN PtrSafe Language Reference
在64位版本的Office中运行时,Declare语句必须包含PtrSafe关键字 . PtrSafe关键字断言Declare语句在64位开发环境中运行是安全的 . 将PtrSafe关键字添加到Declare语句只表示Declare语句显式指向64位,语句中需要存储64位的所有数据类型(包括返回值和参数)仍必须修改为使用64位数量保存要么是LongLong用于64位积分,要么是LongPtr用于指针和句柄 .
在模块的顶部包含声明部分 . 如果它们存在,您通常会在这里找到Option Statement(s) .
您可以在同一区域声明您的DLL函数,您可以在任何过程之外执行此操作 .
在64位MS Office发布之前的几天,您只需使用以下参数声明DLL过程:
以下是sleep API的示例:
但是,MS发布了他们软件的64位版本,并附带了新版本的VBA,称为
VBA7
. 问题是64位操作系统和软件使用不同的内存指针和句柄,因此重要的是VBA知道declare语句在64位环境中运行是安全的 . 为了让VBA知道这一点,您需要修改函数的数据类型,通常类型为LongPtr
,用于内存指针,而不是Long
(或数量应为LongLong
类型 .您可以使用以下声明通知VBA您的声明是正确的:
声明为PtrSafe的相同Sleep API的示例:
如果您不确定最终用户是否正在使用新的
VBA7?
,幸运的是,如果前缀为#
,您的声明中可以使用If...Then
语句 . 您可以使用以上声明使代码适用于任何VBA环境: