我使用XLW創建XLL函數以在Excel中註冊。 XLL在C++ DLL中調用實際的數學模型。由XLW製作的XLL和BOOST UBLAS MyMatrix數據類型轉換爲雙**失敗
我使用BOOST和UBLAS協助將XLL MyMatrix數據類型轉換爲C++ DLL用於輸入的double **。這種構建是正確的,我可以在我的開發環境中正確使用陣列輸入和輸出的功能。
但是,當我使用InstallShield安裝程序在目標計算機上安裝我的Excel加載項時,帶有數組輸入的函數正在返回「Conversion to double」錯誤,而不是函數的C++ DLL返回值。
這是我到目前爲止已經試過,沒有運氣:
1.使用BOOST BCP收集所有的數字圖書館(的uBLAS不來了),而且我把它在我的Visual Studio 2013項目。然後我把BOOST_ROOT了包括和使用項目屬性,因此它會用什麼項目(從我有限的瞭解)
的安裝所有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並使用盒轉換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)); }
};
您是否嘗試通過依賴關係walker(http://www.dependencywalker.com/)查看目標計算機上的xll依賴項?你應該能夠找到缺少的dll(我認爲是這種情況)。另外,一定要在發行版而不是調試模式下構建。 – Malick
謝謝,我忘了說我使用了Dependency Walker,並確保目標計算機具有所有DLL。該版本處於發佈模式。 – RESTfulInSeattle
一片一片,我開始在目標機器上匹配開發環境的配置。 VS 2013安裝完成後,我在機器上構建了XLL,它工作正常。 我已經刪除了解決方案文件,環境變量,BOOST文件,XLW文件。我卸載了VS 2013.我使用了我製作的安裝程序,它仍然有效。然而VS 2013留下了一些東西,我會卸載每一個,然後測試,直到找到需要分發的東西。 – RESTfulInSeattle