问题描述
我正在将一些代码从 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