1

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 を取り出し、プロジェクトのプロパティを使用して、プロジェクトにあったものを使用するようにしました (私の限られた理解から)

  1. 両方のビット数の Microsoft C++ 再頒布可能パッケージをすべて、対象のコンピューターにインストールします。

  2. コピー先のコンピューターに BOOST をダウンロードしてビルドし、BOOST_ROOT の環境変数を作成します。宛先コンピューターに XLW をインストールし、宛先コンピューターの開発環境のすべての環境変数を一致させました。

  3. 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)); }
};
4

1 に答える 1