C++ 如何在VBA中声明接受XlfOper(LPXLOPER)类型参数的函数?
在上一篇文章的答案中,我发现了一种不用注册就可以调用(C++)xll中定义的函数的方法。我以前使用的是XLW提供的注册基础设施,我使用的是XlfOper类型在VBA和xll之间传递参数 < C++函数是这样的:C++ 如何在VBA中声明接受XlfOper(LPXLOPER)类型参数的函数?,c++,visual-studio,vba,excel,xlw,C++,Visual Studio,Vba,Excel,Xlw,在上一篇文章的答案中,我发现了一种不用注册就可以调用(C++)xll中定义的函数的方法。我以前使用的是XLW提供的注册基础设施,我使用的是XlfOper类型在VBA和xll之间传递参数 < C++函数是这样的: extern "C" { LPXLOPER EXCEL_EXPORT a_function(XlfOper arg1, XlfOper arg2); } 根据我之前解决方案的答案,我直接声明函数,类似于: Declare Function an_exported_function Li
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的实例
经过一些研究,我发现: MSDN写道:许多DLL函数要求您使用预定义格式传入数据结构。从VBA调用DLL函数时,传递根据函数要求定义的用户定义类型
因此,您需要定义XlfOper数据结构;) 您是否尝试过使用Application.RunfromVBA?它在我的情况下无法工作,因为我有20多个参数。该问题在链接问题中有详细描述。谢谢你的建议@Charles.apologies,我还没有看过你原来的问题。我使用XLL Plus而不是XLW,20之后它会重复参数描述。XLW中可能有20个参数的限制,当然函数向导中也有20个参数描述的限制,但函数中没有20个参数的限制。不知道Application.run的限制。也许可以尝试VBA函数包装器?您试图传递哪些值?通常将VBA参数声明为“范围”,因为这是您希望xloper成为的类型。请尝试将输入参数定义为变量(而不是对象)。XlfOper是否为结构化数据类型?