2016-06-10 49 views
1

我使用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)); } 
    }; 
    
    +0

    您是否嘗試通過依賴關係walker(http://www.dependencywalker.com/)查看目標計算機上的xll依賴項?你應該能夠找到缺少的dll(我認爲是這種情況)。另外,一定要在發行版而不是調試模式下構建。 – Malick

    +0

    謝謝,我忘了說我使用了Dependency Walker,並確保目標計算機具有所有DLL。該版本處於發佈模式。 – RESTfulInSeattle

    +0

    一片一片,我開始在目標機器上匹配開發環境的配置。 VS 2013安裝完成後,我在機器上構建了XLL,它工作正常。 我已經刪除了解決方案文件,環境變量,BOOST文件,XLW文件。我卸載了VS 2013.我使用了我製作的安裝程序,它仍然有效。然而VS 2013留下了一些東西,我會卸載每一個,然後測試,直到找到需要分發的東西。 – RESTfulInSeattle

    回答

    0

    我已經包含在Visual C++ 12.0 CRT(64)的安裝程序,因爲這是VS 2013格式的64位XLL,但事實證明,我還需要包含Visual C++ 12.0 CRT(ARM)。我歡迎任何人的評論,爲什麼我需要包括這一點。謝謝!

    相關問題