在 VBA 中将 32 位 OleAut 调用转换为 64 位
Converting 32 bit OleAut call into 64 bit in VBA
我在将此 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 冻结。
DispCallFunc function 声明如下:
HRESULT DispCallFunc(
void *pvInstance,
ULONG_PTR oVft,
CALLCONV cc,
VARTYPE vtReturn,
UINT cActuals,
VARTYPE *prgvt,
VARIANTARG **prgpvarg,
VARIANT *pvargResult
);
- pvInstance 是一个指针[输入]
- oVft 是一个指针[输入]
- cc是一个32位整数[input]
- vtReturn 是一个 16 位整数 [input]
- cActuals 是一个 32 位整数[输入]
- prgvt 是一个 16 位整数数组(所以是一个指针)[input]
- prgpvarg 是 VARIANT 上的指针数组(所以是指针)[input]
- pvargResult 是一个指向 VARIANT 的指针,所以一个 byref VBA 的 Variant [output]
因此,对于 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
我在将此 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 冻结。
DispCallFunc function 声明如下:
HRESULT DispCallFunc(
void *pvInstance,
ULONG_PTR oVft,
CALLCONV cc,
VARTYPE vtReturn,
UINT cActuals,
VARTYPE *prgvt,
VARIANTARG **prgpvarg,
VARIANT *pvargResult
);
- pvInstance 是一个指针[输入]
- oVft 是一个指针[输入]
- cc是一个32位整数[input]
- vtReturn 是一个 16 位整数 [input]
- cActuals 是一个 32 位整数[输入]
- prgvt 是一个 16 位整数数组(所以是一个指针)[input]
- prgpvarg 是 VARIANT 上的指针数组(所以是指针)[input]
- pvargResult 是一个指向 VARIANT 的指针,所以一个 byref VBA 的 Variant [output]
因此,对于 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