XLW を使用して、Excel に登録する関数の XLL を作成しています。XLL は、C++ DLL 内の実際の数学モデルを呼び出します。
UBLAS で BOOST を使用して、XLL MyMatrix データ型から C++ DLL が入力に使用する double ** への変換を支援しています。これは正しくビルドされ、開発環境で配列の入力と出力を持つ関数を正しく使用できます。
しかし、InstallShield インストーラーを使用して Excel アドインをインストール先のコンピューターにインストールすると、配列入力を使用する関数は、C++ DLL からの関数の戻り値ではなく、"Conversion to double" エラーを返します。
これは私がこれまでに試したことですが、運が悪いです:
1. BOOST BCP を使用してすべての Numeric ライブラリを収集し (UBLAS は登場しませんでした)、それを Visual Studio 2013 プロジェクトに含めました。次に、インクルードから BOOST_ROOT を取り出し、プロジェクトのプロパティを使用して、プロジェクトにあったものを使用するようにしました (私の限られた理解から)
両方のビット数の Microsoft C++ 再頒布可能パッケージをすべて、対象のコンピューターにインストールします。
コピー先のコンピューターに BOOST をダウンロードしてビルドし、BOOST_ROOT の環境変数を作成します。宛先コンピューターに XLW をインストールし、宛先コンピューターの開発環境のすべての環境変数を一致させました。
Dependency Walker を使用して、すべての依存 DLL が対象のコンピューターにあることを確認しました。
すべて運が悪い。インストーラーには何を含める必要がありますか? お時間をいただきありがとうございます。
開発環境: Visual Studio 2013 および 2015 を搭載した Windows 10
宛先コンピューター: 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)); }
};