1

我正在使用 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 从包含中取出并使用项目属性,以便它使用项目中的内容(根据我的有限理解)

  1. 在目标计算机上安装这两个位的所有 Microsoft C++ Redistributables。

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

  3. 使用 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)); }
};
4

1 回答 1

0

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

于 2016-06-16T00:52:05.883 回答