该代码显示“符合错误”早些时候,并要求更新到64位,所以我改变并添加了“PtrSafe”在几个地方,但现在它是给
“byref参数类型不匹配”
上面代码中的错误。通过高亮显示为布尔值。
代码早期工作正常,但最近我已将Excel更改为Office365,其中它不工作。我不知道该怎么补救如果有人可以帮助修复上述代码?先谢谢你了。
Public Function Hook() As Boolean
Dim TmpBytes(0 To 5) As Byte
Dim p As LongPtr
Dim OriginProtect As LongPtr
Hook = False
pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
If TmpBytes(0) <> &H68 Then
MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
p = GetPtr(AddressOf MyDialogBoxParam)
HookBytes(0) = &H68
MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
HookBytes(5) = &HC3
MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
Flag = True
Hook = True
End If
End If
End Function
1条答案
按热度按时间qv7cva1a1#
仅仅添加
PtrSafe
并不能使函数在64位中工作。PtrSafe
只是告诉VBA,“嘿,你在64位中使用这个也是安全的(我确保它能工作)”--确保它能工作必须由你来做。你可以在这里看到关于兼容性的文档:https://learn.microsoft.com/en-us/office/client-developer/shared/compatibility-between-the-32-bit-and-64-bit-versions-of-office最重要的事情(也是您的问题所在)是,指针和句柄的大小取决于您使用的是32位还是64位。指针/句柄。在32位中,它们应该是
Long
类型,而64位类型为LongLong
-类型LongPtr
分配的类型取决于您是32位还是64位。因此,在32位LongPtr
上是Long
在64位LongLong
上是Long
-所以你通常要做的是检查你的声明函数,检查API文档,并确保你所有的指针/句柄都是LongPtr
类型-关于更深入和更详细的解释,请参阅上面链接的资源。