我正在使用XLW创建XLL函数以在Excel中注册。 XLL在C ++ DLL中调用实际的数学模型。
我正在使用BOOST和UBLAS来帮助从XLL MyMatrix数据类型转换为C ++ DLL用于输入的双**。这构建正确,我可以在我的开发环境中正确使用数组输入和输出的函数。
但是,当我使用InstallShield安装程序在目标计算机上安装Excel加载项时,带有数组输入的函数将返回"转换为double"错误,而不是C ++ DLL中函数的返回值。
这是我迄今为止所尝试过的,没有运气:
1.使用BOOST BCP收集所有数字库(UBLAS没有出现),我将其包含在我的Visual Studio 2013项目中。然后我从包含和使用项目属性中取出BOOST_ROOT,以便它将使用项目中的内容(来自我的有限理解)
在目标计算机上为这两个位安装所有Microsoft C ++ Redistributable。
在目标计算机上下载并构建BOOST,并创建BOOST_ROOT的环境变量。在目标计算机上安装XLW,并匹配目标计算机上开发环境中的所有环境变量。
使用Dependency Walker验证所有相关DLL是否在目标计算机上。
一切都没有运气。我的安装程序需要包含哪些内容?谢谢你的时间。
开发环境: Windows 10与Visual Studio 2013和2015
目标计算机: Windows 10与Office 2016
MyMatrix宣布:
namespace xlw {
#ifdef USE_XLW_WITH_BOOST_UBLAS
#define USE_PARENTHESESES
typedef boost::numeric::ublas::matrix<double> MyMatrix;
typedef boost::numeric::ublas::vector<double> MyArray;
typedef MyMatrix NEMatrix;
功能声明中的MyMatrix:
MyMatrix
ExcelFunctionName(
double Function,
double ReportDate,
double TotalOptIssued,
double PrevestForfOpt,
double NonvestedOpt,
double ExpectedTurnoverRate,
const MyMatrix VestingSchedule
调用C ++ DLL并使用Box将MyMatrix转换为double **
Error err = CPPDLLFunctionName(Function, ReportDate, TotalOptIssued, PrevestForfOpt, NonvestedOpt, ExpectedTurnoverRate,
VestingSchedule.size1(), VestingSchedule.size2(), Box(VestingSchedule).m, Box(out).m);
执行转换的框
#include <boost/numeric/ublas/matrix.hpp>
using namespace boost::numeric::ublas;
class Box {
public:
double **m;
Box(const matrix<double>& t) {
m = static_cast<double **>(malloc(static_cast<size_t>((t.size1())*sizeof(double*))));
for (size_t i = 0; i < t.size1(); i++)
m[i] = const_cast<double*>(&(t.data()[i*t.size2()]));
}
~Box() { free(static_cast<void *>(m)); }
};
答案 0 :(得分:0)
我在安装程序中包含了Visual C ++ 12.0 CRT(x64),因为这是VS 2013格式的64位XLL,但事实证明我还需要包含Visual C ++ 12.0 CRT(ARM)。我欢迎任何人评论为什么我需要包括这个。谢谢!