Вы бы сделали хотя бы поиск по данному форуму по ключевому слову "ComDispFunction". Есть масса примеров его использования.
В данном конкретном случае решение будет выглядеть так:
Сначала коллекция листов (рабочая книга. Файл Excel)
X++:
// Метод getWorkSheets()
private COM getWorkSheets()
{
ComVariant varRet;
ComDispFunction funcGet;
;
if (!comWorkSheets && m_comDocument)
{
try
{
/*
comWorkSheets = m_comDocument.worksheets();
*/
funcGet = new ComDispFunction(m_comDocument, "worksheets", COMDispContext::PropertyGet);
varRet = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_DISPATCH);
funcGet.call(varRet);
comWorkSheets = COM::createFromInterface(varRet.iDispatch());
}
catch (Exception::Error)
{
throw error("@GEE6043");
}
}
return comWorkSheets;
}
Теперь собственно один лист
X++:
private COM getWorkSheet(anytype _workSheetID)
{
COM comRet;
ComVariant varRet;
ComDispFunction funcGet;
COMVariant varArgStr;
COMVariant varArgInt;
;
if (m_comDocument)
{
try
{
this.getWorkSheets();
/*
comRet = comWorkSheets.item(_workSheetID);
*/
funcGet = new ComDispFunction(comWorkSheets, "item", COMDispContext::PropertyGet);
varRet = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_DISPATCH);
switch (typeOf(_workSheetID))
{
case types::String :
varArgStr = new COMVariant(COMVariantInOut::In, COMVariantType::VT_BSTR);
varArgStr.bStr(_workSheetID);
funcGet.call(varArgStr, varRet);
break;
case types::Integer :
varArgInt = new COMVariant(COMVariantInOut::In, COMVariantType::VT_INT);
varArgInt.int(_workSheetID);
funcGet.call(varArgInt, varRet);
break;
default :
throw error('Не корректный тип параметра');
break;
} // switch (typeOf(_workSheetID))
comRet = COM::createFromInterface(varRet.iDispatch());
}
catch (Exception::Error)
{
throw error("@GEE6043");
}
}
return comRet;
}