我在将此 API 调用转换为 VBA 的 64 位可访问调用时遇到一些问题。
API声明
Private Declare PtrSafe Function DispCallFunc Lib "OleAut32.dll" ( _
ByVal pvInstance As Long, _
ByVal oVft As Long, _
ByVal cc As Long, _
ByVal vtReturn As Integer, _
ByVal cActuals As Long, _
ByVal prgvt As Long, _
ByVal prgpvarg As Long, _
ByVal pvargResult As Long _
) As Long
客户端代码
Public Sub Main()
' On this line I get "compile error: type mismatch" because AddressOf method
' returns LongPtr but DispCallFunc expects Long.
DispCallFunc 0, AddressOf Foo, CLng(4), VbVarType.vbEmpty, 0, 0, 0, 0
End Sub
Private Sub Foo()
Debug.Print 100
End Sub
我尝试在 DispCallFunc
中将 Long
更改为 LongPtr
,但每次我对 API 进行更改并运行宏时,Excel 都会卡住。
最佳答案
HRESULT DispCallFunc(
void *pvInstance,
ULONG_PTR oVft,
CALLCONV cc,
VARTYPE vtReturn,
UINT cActuals,
VARTYPE *prgvt,
VARIANTARG **prgpvarg,
VARIANT *pvargResult
);
- pvInstance 是一个指针[输入]
- oVft 是一个指针[输入]
- cc 是一个 32 位整数[输入]
- vtReturn 是一个 16 位整数[输入]
- cActuals 是一个 32 位整数[输入]
- prgvt 是一个 16 位整数数组(因此是一个指针)[输入]
- prgpvarg 是 VARIANT 上的指针数组(因此是一个指针)[输入]
- pvargResult 是 VARIANT 上的指针,因此是 byref VBA 的 Variant [输出]
所以,对于 VBA:
Private Declare PtrSafe Function DispCallFunc Lib "OleAut32.dll" ( _
ByVal pvInstance As LongPtr, _
ByVal oVft As LongPtr, _
ByVal cc As Long, _
ByVal vtReturn As Integer, _
ByVal cActuals As Long, _
ByVal prgvt As LongPtr, _
ByVal prgpvarg As LongPtr, _
ByRef pvargResult As Variant) As Long
关于excel - 在 VBA 中将 32 位 OleAut 调用转换为 64 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61183261/