从c ++ xll的excel中接收一个matrix,修改它并返回

我编写了一个xll函数接收来自excel的matrix,修改它返回它:

__declspec(dllexport) LPXLOPER12 WINAPI ZZZZUpdateArray1(LPXLOPER12 arrayin) { if (arrayin->xltype == xltypeMulti | xlbitDLLFree) { double ScaleFactor = 2.0; int rows = arrayin->val.array.rows; int cols = arrayin->val.array.columns; static XLOPER12 xlArray; xlArray.val.array.lparray = reinterpret_cast<LPXLOPER12>(::new XLOPER12[rows * cols] /*::malloc(rows * cols * sizeof(XLOPER12))*/); for (int r = 0; r<rows; r++) { for (int c = 0; c<cols; c++) { if ((arrayin->val.array.lparray + ((r* cols) + c))->xltype == xltypeNum) { XLOPER12* var = xlArray.val.array.lparray + ((r* cols) + c); var->xltype = xltypeNum; var->val.num = ScaleFactor*(arrayin->val.array.lparray + ((r* cols) + c))->val.num ; } } } return static_cast<LPXLOPER12>(&xlArray); } return arrayin; } 

但它崩溃了

 if ((arrayin->val.array.lparray + ((r* cols) + c))->xltype == xltypeNum) 

如果我是例如从Excel中取5 * 5matrix,在debugging时,我看到它有19行20列,发生了什么!

这可能是因为当我收到LPXLOPER12 arrayin ,它代表了一个excel范围,比5 * 5matrix复杂得多。 如何访问它包含的5 * 5matrix,然后?

  • 使用Excel代码Q来注册input参数。
  • 你需要正确地声明返回variables:

     // initialize the return variable xlArray.val.array.rows = rows; xlArray.val.array.columns = cols; xlArray.xltype = xltypeMulti | xlbitDLLFree;