XLL由XLW制造,BOOST UBLAS MyMatrix数据类型转换为双**失败

XLL Made By XLW with BOOST UBLAS MyMatrix Data Type Conversion to Double ** Failing

本文关键字:类型转换 数据 失败 MyMatrix UBLAS XLW 制造 BOOST XLL      更新时间:2023-10-16

我正在使用XLW创建XLL函数,以便在Excel中注册。XLL调用C++DLL中的实际数学模型。

我使用BOOST和UBLAS来帮助从XLL MyMatrix数据类型转换为C++DLL用于输入的双**。这是正确构建的,并且我可以在我的开发环境中正确地使用带有数组输入和输出的函数。

但是,当我使用InstallShield安装程序在目标计算机上安装Excel加载项时,具有数组输入的函数会返回"转换为双精度"错误,而不是函数从C++DLL返回的值。

这是我迄今为止尝试过的,但没有成功:

1.使用BOOST BCP收集所有数值库(UBLAS没有出现),我将其包含在我的Visual Studio 2013项目中。然后,我将BOOST_ROOT从包含和使用项目属性中删除,这样它就可以使用项目中的内容(据我所知)

  1. 在目标计算机上为这两个位安装所有的Microsoft C++可再发行程序。

  2. 在目标计算机上下载并构建BOOST,并创建BOOST_ROOT环境变量。在目标计算机上安装XLW,并匹配目标计算机上开发环境中的所有环境变量。

  3. 使用依赖项Walker验证所有依赖DLL都在目标计算机上。

都没有运气。我需要在安装程序中包含什么?谢谢你抽出时间。

开发环境:带有Visual Studio 2013和2015 的Windows 10

目标计算机:带有Office 2016 的Windows 10

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转换为双**

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)); }
};

我在安装程序中包含了Visual C++12.0 CRT(x64),因为这是一个VS 2013格式的64位XLL,但事实证明我还需要包含Visual C++12.0 CRT(ARM)。我欢迎任何人评论我为什么需要包括这一点。谢谢