2

我在上一个问题的答案中发现了一种无需注册即可调用 (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:\MyPath\myxll.xll"_
          Alias "a_function" (arg1 As Object, arg2 As Object) as Object

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

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

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

4

1 回答 1

1

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

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

所以,你需要定义 XlfOper 数据结构;)

于 2014-01-08T17:10:04.837 回答