2

我在将此 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

我尝试更改LongLongPtrin,DispCallFunc但每次更改 API 并运行宏时,Excel 都会冻结。

4

1 回答 1

2

DispCallFunc函数声明如下:

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
于 2020-04-13T08:48:09.097 回答