如何在 VBA 中声明一个接受 XlfOper (LPXLOPER) 类型参数的函数

How do I declare a function in VBA which accepts arguments of type XlfOper (LPXLOPER)?

本文关键字:XlfOper LPXLOPER 函数 类型参数 一个 VBA 声明      更新时间:2023-10-16

我在上一个问题的答案中发现了一种调用 (C++) xll 中定义的函数而无需注册它的方法。我以前使用 XLW 提供的注册基础结构,并且使用 XlfOper 类型在 VBA 和 xll 之间传递参数。

c++ 函数如下所示:

extern "C" {
LPXLOPER EXCEL_EXPORT a_function(XlfOper arg1, XlfOper arg2);
}

按照我之前的解决方案的答案,我直接声明函数,如下所示:

Declare Function an_exported_function Lib "MyDrive:MyPathmyxll.xll"_
          Alias "a_function" (arg1 As Object, arg2 As Object) as Object

通过附加到 excel 进程,我可以看到该函数正在被调用,但我在参数中获得了垃圾或空数据。我想,这是因为我没有告诉 VBA 如何转换为正确的数据类型。

如何正确调用 XlfOper 参数?我认为调用LPXLOPER应该可以完成这项工作,因为xlw声明以下内容:

重要的是不要添加任何数据成员或虚拟 此类的函数。 xlw 的设计依赖于这样一个事实,即类 XlfOper 的大小与 LPXLOPER/LPXLOPER12 相同,此假设允许 从 Excel 接收的这些类型的值将由库解释 作为 XlfOper 的实例。

经过一番研究,我发现了它: 传递用户定义类型

MSDN 写道: 许多 DLL 函数要求您使用预定义的格式传入数据结构。从 VBA 调用 DLL 函数时,传递根据函数的要求定义的用户定义类型。

因此,您需要定义 XlfOper 数据结构;)