我正在使用 XLW 创建要在 Excel 中注册的 XLL 函数。XLL 在 C++ DLL 中调用实际的数学模型。
我正在使用带有 UBLAS 的 BOOST 来帮助将 XLL MyMatrix 数据类型转换为 C++ DLL 用于输入的双 **。这可以正确构建,并且我可以在我的开发环境中正确使用具有数组输入和输出的函数。
但是,当我使用 InstallShield 安装程序在目标计算机上安装我的 Excel 加载项时,具有数组输入的函数返回“转换为双精度”错误,而不是来自 C++ DLL 的函数返回值。
这是我到目前为止尝试过的,没有运气:
1.使用 BOOST BCP 收集所有的 Numeric 库(UBLAS 没有出现),并将其包含在我的 Visual Studio 2013 项目中。然后我将 BOOST_ROOT 从包含中取出并使用项目属性,以便它使用项目中的内容(根据我的有限理解)
在目标计算机上安装这两个位的所有 Microsoft C++ Redistributables。
在目标计算机上下载并构建 BOOST,并创建 BOOST_ROOT 环境变量。在目标计算机上安装了 XLW,并在目标计算机上匹配了开发环境中的所有环境变量。
使用 Dependency Walker 来验证所有依赖 DLL 是否在目标计算机上。
一切都没有运气。我的安装程序需要包含什么?感谢您的时间。
开发环境:Windows 10 和 Visual Studio 2013 和 2015
目标计算机:装有 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 转换为 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)); }
};