Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在VBA中声明接受XlfOper(LPXLOPER)类型参数的函数?_C++_Visual Studio_Vba_Excel_Xlw - Fatal编程技术网

C++ 如何在VBA中声明接受XlfOper(LPXLOPER)类型参数的函数?

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

在上一篇文章的答案中,我发现了一种不用注册就可以调用(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的实例


经过一些研究,我发现:

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


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

您是否尝试过使用Application.RunfromVBA?它在我的情况下无法工作,因为我有20多个参数。该问题在链接问题中有详细描述。谢谢你的建议@Charles.apologies,我还没有看过你原来的问题。我使用XLL Plus而不是XLW,20之后它会重复参数描述。XLW中可能有20个参数的限制,当然函数向导中也有20个参数描述的限制,但函数中没有20个参数的限制。不知道Application.run的限制。也许可以尝试VBA函数包装器?您试图传递哪些值?通常将VBA参数声明为“范围”,因为这是您希望xloper成为的类型。请尝试将输入参数定义为变量(而不是对象)。XlfOper是否为结构化数据类型?