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). Я приветствую чьи-либо комментарии о том, почему я должен был включить это. Спасибо!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]