在 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