英文:
Adding "PtrSafe" in few places
问题
以下是翻译好的内容:
"Complie Error" 之前显示代码,并要求将其更新为 64 位,因此我在几个地方添加了 "PtrSafe",但现在它在上面的代码中出现了 "byref argument type mismatch" 错误,标记为布尔类型。
之前代码正常工作,但最近我已将Excel更改为Office365,但它不起作用。我不知道如何修复这个问题。如果有人能帮忙修复上面的代码,不胜感激。
英文:
The code was showing "Complie Error" earlier and asking to update it to 64 bit so I changed and added "PtrSafe" in few places but now it is giving
> "byref argument type mismatch"
error in above code. by highlighting to boolean.
The code was earlier working fine but recently I have changed excel to Office365 in which it is not working. I don't know how to fix this. If someone can help fixing the above code? Thanks in advance.
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
得分: 1
只添加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位还是
英文:
Just adding PtrSafe
does not make your function work in 64-bit. The PtrSafe
just tells VBA, "hey you are safe to use this in 64-bit as well (I made sure it works)" - the making sure it works has to be done by you. You can see documentation on compatibility here: https://learn.microsoft.com/en-us/office/client-developer/shared/compatibility-between-the-32-bit-and-64-bit-versions-of-office
The most important thing (and where your problem probably lies) is, that pointers and handles have a different size depending on if you are using 32bit or 64bit. Pointers/handles. In 32bit they should be of type Long
in 64bit of type LongLong
- The Type LongPtr
assigns the type depending on if you are on 32bit or 64bit. So on 32bit LongPtr
is Long
on 64bit LongLong
- So what you usually do is go through your Declare Functions, check the APIs documentation, and make sure all your pointers/handles are of type LongPtr
- For a more in depth and more detailed explanation see the resource linked above.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论