使用GetMem和VarPtr避开对象默认值 [英] Using GetMem and VarPtr to get around Object default values

查看:139
本文介绍了使用GetMem和VarPtr避开对象默认值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,我正在为回调对象创建一个时髦的VBA类.当前的问题之一是,当从函数的调用方法返回数据时,我必须运行两次该方法,一个用于确定变量类型,另一个用于返回变量:

So I'm making a funky VBA class for callback objects. Currently one of the issues is that when returning data from the function's call method I have to run the method twice, one to determine the variable type and another to return the variable:

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函数来执行此操作:

Recently I figured that I might be able to do this without calling the VBA function multiple times by dereferencing the result using VarPtr and then using GetMem4:

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)

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

This specific example didn't work but I was wondering whether there was an obvious reason as to why this didn't work?

有什么想法吗?

推荐答案

我也向vbforums和

I asked the question to vbforums also and they got there much faster than stackoverflow!

解决方案非常简单:

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))

简单!

这篇关于使用GetMem和VarPtr避开对象默认值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆