VBA VARIANT返回types和C ++ Excel加载项的64位版本问题

在将C ++ Excel加载项从32位版本迁移到64位版本的过程中,我注意到函数返回VARIANT数据types的一些奇怪行为。

例如,我们可能通常在插件VBA封装器中声明这样的声明XLL的入口点:

Public Declare PtrSafe Function Foo Lib "addin.xll" Alias "xlFoo" () As Variant 

然后在XLL的C ++源代码中,我们可以这样做:

 VARIANT __declspec(dllexport) __stdcall xlFoo() { int result = calc_foo_int(); VARIANT ret; VariantInit(&ret); V_VT(&ret) = VT_I4; V_I4(&ret) = result; return ret; } 

现在,在32位的世界里,一切正常。 我们可以在VBA脚本或者Excel工作表单元中调用这个函数,我们将会得到我们期待的结果。

然而,在64位的世界里,情况并不是那么好。 我们实际上可以在VBA脚本中调用这个函数,它将正常运行,但是如果我们直接从Excel单元格中调用它,也就是input:

 =Foo() 

Excel崩溃,并要求重新启动!

我已经search了高和低,但我找不到任何地方说任何处理64位Excel的VARIANT返回types的任何其他方式,或者这是有点问题,应该避免(尽pipe罚款32位世界)。

我所见过的最接近的东西是在这篇文章中,这似乎意味着(奇怪的是)在64位Officecallback函数中不支持VARIANT返回types:

您必须在64位环境中运行的VBAmacros中显式声明返回types

所以我最好的预感是,也许出于同样的原因,VARIANT返回types不支持64位Excel加载,至less可以从电子表格中的单元格调用?

有没有人能够确认或否认这是事实,或者可能会进一步阐明这个问题?

任何和所有的帮助,感激地收到!

(哦,我应该指出,我认识到在上述情况下使用VARIANT返回types为一个简单的整数值是矫枉过正的 – 这只是一个简单的演示案例 – 我们的一些返回types是混合数据types的复杂数组并保证VARIANT返回types)