dimanche 15 mars 2015

MSExcel API crashing on IDispatch::Invoke("Range")


I created a class for cell and sheet (both has their own IDispatch). I called AutoWrap("Range") and it worked fine.



wchar_t wcParam[16];
char ulColName[16] = "";
char lrColName[16] = "";
GetColName(ulColName, col + 1);
GetColName(lrColName, col + colspan);
swprintf(wcParam, L"%hs%d:%hs%d", ulColName, row + 1, lrColName, row + rowspan);

VARIANT pars;
VariantInit(&pars);
pars.vt = VT_BSTR;
pars.bstrVal = ::SysAllocString(wcParam);

VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, sheet.dispatch, L"Range", 1, pars);
cell = result.pdispVal;


Sheet has getRange() function which is the same as above:



IDispatch* CXlsSheet::getRange(int ulCol, int ulRow, int lrCol, int lrRow)
{
DBGPrintf("CXlsSheet ");
wchar_t wcParam[16];
char ulColName[16] = "";
char lrColName[16] = "";
GetColName(ulColName, ulCol);
GetColName(lrColName, lrCol);
swprintf(wcParam, L"%hs%d:%hs%d", ulColName, ulRow, lrColName, lrRow);

VARIANT pars;
VariantInit(&pars);
pars.vt = VT_BSTR;
pars.bstrVal = ::SysAllocString(wcParam);

VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, dispatch, L"Range", 1, pars);
return result.pdispVal;
};


When I call getRange() instead of the first code, it crashes.



cell = sheet.getRange(col + 1, row + 1, col + colspan, row + rowspan)


Any idea why?




Aucun commentaire:

Enregistrer un commentaire