首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GetMem和VarPtr避开对象缺省值

使用GetMem和VarPtr避开对象缺省值
EN

Stack Overflow用户
提问于 2019-04-23 19:34:39
回答 1查看 215关注 0票数 2

所以我为回调对象做了一个时髦的VBA类。当前的一个问题是,当从函数的call方法返回数据时,我必须运行该方法两次,一次是确定变量类型,另一次是返回变量:

代码语言:javascript
复制
If VarType(Application.Run(Callback("Parent") & "." & Callback("Name"), args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18), args(19), args(20), args(21), args(22), args(23), args(24), args(25), args(26), args(27), args(28), args(29))) = vbObject Then
  Set CallCallback = Application.Run( _
    Callback("Parent") & "." & Callback("Name"), _
    args(0), args(1), _
    args(2), args(3), _
    args(4), args(5), _
    args(6), args(7), _
    args(8), args(9), _
    args(10), args(11), _
    args(12), args(13), _
    args(14), args(15), _
    args(16), args(17), _
    args(18), args(19), _
    args(20), args(21), _
    args(22), args(23), _
    args(24), args(25), _
    args(26), args(27), _
    args(28), args(29))
Else
  CallCallback = Application.Run( _
    Callback("Parent") & "." & Callback("Name"), _
    args(0), args(1), _
    args(2), args(3), _
    args(4), args(5), _
    args(6), args(7), _
    args(8), args(9), _
    args(10), args(11), _
    args(12), args(13), _
    args(14), args(15), _
    args(16), args(17), _
    args(18), args(19), _
    args(20), args(21), _
    args(22), args(23), _
    args(24), args(25), _
    args(26), args(27), _
    args(28), args(29))
End If

最近我发现,通过使用VarPtr然后使用GetMem4取消对结果的引用,可以在不多次调用VBA函数的情况下实现这一点

代码语言:javascript
复制
Private Declare Function GetMem4 Lib "msvbvm60.dll" (ByVal Addr As Long, ByRef RetVal As Any) As Long
...
Dim vp As LongPtr, vRet as Variant
vp = VarPtr(Application.Run(Callback("Parent") & "." & Callback("Name"), args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18), args(19), args(20), args(21), args(22), args(23), args(24), args(25), args(26), args(27), args(28), args(29)))
Call GetMem4(vp, vRet)

这个特定的例子不起作用,但我想知道是否有一个明显的原因,为什么它不起作用?

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2019-04-25 04:38:53

我也在vbforums和they got there much faster than stackoverflow上问了这个问题!

解决方案非常简单:

代码语言:javascript
复制
Public Declare Sub VariantCopy Lib "oleaut32.dll" (ByRef pvargDest As Variant, ByRef pvargSrc As Variant)
...
VariantCopy CallCallback, Application.Run( _
  Callback("Parent") & "." & Callback("Name"), _
  args(0), args(1), _
  args(2), args(3), _
  args(4), args(5), _
  args(6), args(7), _
  args(8), args(9), _
  args(10), args(11), _
  args(12), args(13), _
  args(14), args(15), _
  args(16), args(17), _
  args(18), args(19), _
  args(20), args(21), _
  args(22), args(23), _
  args(24), args(25), _
  args(26), args(27), _
  args(28), args(29))

很简单!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55810316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档