我在前一个question 的答案中找到了一种方法来调用(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的实例。
答案 0 :(得分:1)
经过一些研究后我发现了它:Passing User-Defined Types
MSDN写道: 许多DLL函数都要求您使用预定义的格式传入数据结构。从VBA调用DLL函数时,您将根据函数的要求传递已定义的用户定义类型。
因此,您需要定义XlfOper数据结构;)