首页 > 解决方案 > 是否可以在 Visual Basic 中使用返回类型的 Windows API 函数调用?3个问题

问题描述

问题 1:为什么将其声明为函数而不是子函数?

在 Excel VBA 中调用 windows API 函数时,例如

Private Declare Function getTickCount Lib "kernel32" _
Alias "QueryPerformanceCounter" (cyTickCount As Currency) As Long

可以调用

Dim cyTicks1 As Currency
getTickCount cyTicks1  

它只设置的值cyTicks1(因为参数是一个指针),为什么它在文档中定义为一个函数而不仅仅是一个子。为什么不在 VBA 中编写函数为

Private Declare Sub getTickCount Lib "kernel32" _
Alias "QueryPerformanceCounter" (cyTickCount As Currency)

?

此外,在这个特定函数(QueryPerformanceCounter)的文档中,它是

'Return value
'If the function succeeds, the return value is nonzero.
'If the function fails, the return value is zero. 

然而,试图对返回值做任何事情,都会导致语法错误:

问题2:为什么不能使用这些函数的返回值?

一个函数需要一个返回类型(在这个例子中As Long),但是当尝试使用返回类型时,它会立即显示为红线,当尝试编译或运行代码时会出现语法错误:

Dim QPSresult as Long 'same type as return type of function above
QPSresult = getTickCount cyTicks1 'red line/syntax error. 

getTickCount-function 明确声明为函数。在撰写本文时,Visual Basic 还不知道我正在调用一个实际上只通过指针检索(而不是返回)一个值的 kernell32 函数。所有这些 api/library 调用是否仅适用于指针,因此永远无法存储/使用结果类型?

问题 3:有没有办法捕捉“非零”值?

'If the function succeeds, the return value is nonzero.

当函数的返回类型As Long更改为As Byte或 时As Currency,它似乎没有任何影响。但是将其更改为“作为字符串”会使 Excel 崩溃。我猜 kernel32 会向 VBA 返回一个“非零”值,该值仅在数据类型等数字中被接受。但是,由于语法错误,有没有办法存储这些非零值?

标签: vbawinapiperformancecounterkernel32

解决方案


推荐阅读