【发布时间】:2021-10-30 13:16:01
【问题描述】:
您可以将数据类型用于从 VBA 进行的任何特定 API 调用似乎具有灵活性,但我没有看到关于它们如何工作或如何选择一种的讨论,所以我如何知道哪些数据类型可以安全使用当它们似乎适用于小型测试样本时?假定为 64 位系统/软件。有很多“使用此代码”的示例,但我没有看到关于使用替代数据类型的讨论。
例如,我已经成功使用了三种数据类型...货币、UINT64 高/低(我猜 Long_Integer 中的正确术语?)和 LongLong 在 QueryPerformanceFrequency 的声明中...例如,在此声明中,您可以将 LongLong 更改为其他两个,并根据数据类型适当地使用它们。
Private Declare PtrSafe Function QueryPerformanceFrequency Lib "kernel32" (lpPerformanceFrequency As LongLong) As Long
请注意,使用货币,您确实不得到频率……你得到频率除以 10,000。我没有看到任何关于您已将返回值更改为 MS 文档中说明的值的讨论。如果您在 QueryPerformanceFrequency 中使用 Currency,在 QueryPerformanceCounter 中使用 LongLong,您的计时器计算将出错。
FILETIME 的 LongLong 似乎也作为 API 调用的输入……我创建了最大的 SYSTEMTIME 日期/时间,用 LongLong (SystemTimeToFileTime) 转换了这个 FILTETIME,用 LongLong 数字将它转换回来作为 FILETIME (FileTimeToSystemTime)并获得了与我开始时相同的 SYSTEMTIME 日期/时间。但是,如果我在 FILETIME 中正确阅读了 MS,您不一定能够做到这一点。
我还偶然发现,如果你用 LongLong 高/低值定义一个 UNIT64 数据类型,那么返回的高位部分为零,低位部分包含所有数据。因此,考虑到 UNIT64 的两个部分,您不必将两个 High/Low 的 /form union 转换为 LongLong,只需使用 LowPartLL 中的值即可。
例如代码:
Private Declare PtrSafe Function GetSystemTimePreciseAsFileTime Lib "kernel32" (lpFileTime As UINT64LL) As Long
Public Type UINT64LL
LowPartLL As LongLong
HighPartLL As LongLong
End Type
Dim LLFTCounts as LongLong, u64LLFileTime as UINT64LL
GetSystemTimePreciseAsFile u64LLFileTime
LLFTCounts = UINT64LL.LowPartLL ‘UINT64LL.HighPartLL is zero
那么我怎么知道哪种数据类型可以安全使用,假设它可以处理原始数据的最大大小?例如,如果有人告诉我,对返回无符号和有符号 64 位数据的 API 函数的所有 VBA 数据调用使用 LongLong 数据类型是安全的,并且 API 会给出正确的转换,那将会容易得多。当然,我可以尝试一种数据类型,看看是否适用于一些我当然没有技能水平进行完整测试的示例。
【问题讨论】: