Я использую 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 и использовал свойства проекта, чтобы он использовал то, что было в проекте (из моего ограниченного понимания)
Установите все распространяемые файлы Microsoft C ++ для обеих версий на конечном компьютере.
Загрузите и соберите BOOST на конечном компьютере и создайте переменную окружения BOOST_ROOT. Установил XLW на конечном компьютере и сопоставил все переменные среды в среде разработки на конечном компьютере.
Использовал 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)); }
};
Я включил Visual C ++ 12.0 CRT (x64) в установщик, потому что это был 64-битный XLL в формате VS 2013, однако, как оказалось, мне также нужно было включить Visual C ++ 12.0 CRT (ARM). Я приветствую чьи-либо комментарии о том, почему я должен был включить это. Спасибо!
Других решений пока нет …