XLL Сделано XLW с BOOST UBLAS Преобразование типов данных MyMatrix в двойные ** Сбой

Я использую XLW для создания XLL функций для регистрации в Excel. XLL вызывает фактические математические модели в C++ DLL.

Я использую BOOST с UBLAS, чтобы помочь в преобразовании из типа данных XLL MyMatrix в double **, который C++ DLL использует для ввода. Это создает правильно, и я могу использовать функции с входами и выходами массива правильно в моей среде разработки.

Однако, когда я устанавливаю свою надстройку Excel на конечном компьютере с помощью установщика InstallShield, функции с входами массива возвращают ошибки "Преобразование в двойное число", а не возвращаемое значение функции из библиотеки DLL C++.

Это то, что я пробовал до сих пор, без удачи:

1. Использование BOOST BCP для сбора всей библиотеки Numeric (UBLAS не подходил), и я включил ее в свой проект Visual Studio 2013. Затем я вынул BOOST_ROOT из списка include и использовал свойства проекта, чтобы он использовал то, что было в проекте (из моего ограниченного понимания)

  1. Установите все распространяемые файлы Microsoft C++ для обеих версий на конечном компьютере.

  2. Загрузите и соберите BOOST на конечном компьютере и создайте переменную окружения BOOST_ROOT. Установил XLW на конечном компьютере и сопоставил все переменные среды в среде разработки на конечном компьютере.

  3. Использовал 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 в удвоенную **

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 ответ

Я включил Visual C++ 12.0 CRT (x64) в установщик, потому что это был 64-битный XLL в формате VS 2013, однако, как оказалось, мне также нужно было включить Visual C++ 12.0 CRT (ARM). Я приветствую чьи-либо комментарии о том, почему я должен был включить это. Спасибо!

Другие вопросы по тегам