XLW制作的XLL与BOOST UBLAS MyMatrix数据类型转换为双倍**失败

时间:2016-06-10 17:43:28

标签: c++ boost xll ublas xlw

我正在使用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,以便它将使用项目中的内容(来自我的有限理解)

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

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

  3. 使用Dependency Walker验证所有相关DLL是否在目标计算机上。

  4. 一切都没有运气。我的安装程序需要包含哪些内容?谢谢你的时间。

    开发环境: 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)); }
    };
    

1 个答案:

答案 0 :(得分:0)

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