excel - 在 VBA 中将 32 位 OleAut 调用转换为 64 位

标签 excel vba winapi ole-automation

我在将此 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 位整数[输入]
  • 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/

相关文章:

vba - 如何将一系列 For 循环 block 缩短为一个

vba - 如何通过 VBA 或 excel 公式从文本字符串中提取特定的字母和数字

excel - FullSeriesCollection 在 Excel 2010 中生成 "Compile Error: Method or Data Member not found"

excel - IsNull、IsEmpty、=Empty 和空字符串(即 "")有什么不同,为什么我可以使用变体

excel - IF 空单元格 = 其他空单元格返回 false

excel - 从最后一行到最后一行偏移VBA

excel - 在 VBA Excel 2003 中迭代 800 行的 for 循环需要花费太多时间才能获得所需的输出?如何克服这个问题?

c++ - 使用 C++ 创建的 ListView 控件末尾未创建项目

c++ - 使用 AssocQueryString 从 32 位应用程序获取 64 位应用程序命令,但无法正常工作

C++ COM、Direct2D、Win32 和 WM_CLOSE