VBA kernel32 InterlockedIncrement 在 64 位主机中不可用,我该怎么办?

问题描述

我正在将一些代码从 32 位 VBA 升级到 64 位。它使用 InterlockedIncrement 函数:

Private Declare PtrSafe Function InterlockedIncrement Lib "kernel32" (ByRef Addend As Long) As Long

这以前是由 kernel32 导出的,但仅适用于 x86 调用者。从 64 位 Excel 运行并不是那么简单,我收到“在 kernel32 中找不到 DLL 入口点 InterlockedIncrement”错误 - here's the reason 我发现:

在 64 位窗口上,这些不是真正的函数 [...] 它们是编译器 内在函数代替。 P/调用该函数的代码应该 正在使用互锁托管类

有什么好的选择/我可以解决这个问题吗?


对于上下文,我正在更新 this answer on SO 中的代码,其中 InterlockedIncrement 和 InterlockedDecrement 用于执行 COM 引用计数。现在我明白这些互锁函数是原子操作,这对多线程很重要,但是由于 VBA 在单线程单元中运行,我什至需要打扰吗? this.refCount = this.refCount + 1 是否足够?代码略高于我的头脑,所以我不能 100% 确定我不会因为忘记这些函数而引入错误,但无论如何请让我知道。

解决方法

单线程插入式替换

Private Function InterlockedIncrement(ByRef Addend As Long) As Long
    Addend = Addend + 1
    InterlockedIncrement = Addend
End Function

Private Function InterlockedDecrement(ByRef Addend As Long) As Long
    Addend = Addend - 1
    InterlockedDecrement = Addend
End Function

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...