excel 在少数地方添加“PtrSafe”

egmofgnx  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(186)

该代码显示“符合错误”早些时候,并要求更新到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
qv7cva1a

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类型-关于更深入和更详细的解释,请参阅上面链接的资源。

相关问题