使用COM

时间:2016-05-12 10:57:50

标签: c# arrays com safearray

我想使用COM调用具有以下签名的函数:

void GetCompoundList(ref object compIds, ref object formulae, ref object names, ref object boilTemps, ref object molwts, ref object casnos)

我无法访问实现,但是对象是包含String和Double的SafeArrays的Variant类型,并且都是out参数。

以下是我如何声明数组并调用函数:

Array thermoCompounds = null;
Array thermoCompFormulae = null;
Array thermoCompName = null;
Array thermoCompTemp = null;
Array thermoCompWei = null;
Array thermoCompCAS = null;

ppThermoComp.GetCompoundList(thermoCompounds, thermoCompFormulae, thermoCompName, thermoCompTemp, thermoCompWei, thermoCompCAS);

其中ppThermoComp是实现接口的类的实例。

但是,函数调用无效:调用后数组仍为 null

  • 如果我以正确的大小初始化数组,则不做任何更改:该函数无效
  • 如果我从具有不同参数的同一个COM接口调用另一个函数(例如,返回的数组),它可以正常工作
  • 如果我从C ++代码(仍通过COM)调用此函数,则可以使用

C ++:

CComVariant cIdsM, cFormulaeM, cNamesM, cTempM, cWeiM, cCASM;
HRESULT hr = thermocompoundsMat->GetCompoundList(&cIdsM, &cFormulaeM, &cNamesM, &cTempM, &cWeiM, &cCASM);

知道我的C#代码有什么问题吗?

1 个答案:

答案 0 :(得分:0)

感谢菲利普和汉斯。实际上,我必须根据您的2条评论进行修改以修复代码。

object thermoCompounds = null;
object thermoCompFormulae = null;
object thermoCompName = null;
object thermoCompTemp = null;
object thermoCompWei = null;
object thermoCompCAS = null;

ppThermoComp.GetCompoundList(ref thermoCompounds, ref thermoCompFormulae, ref thermoCompName, ref thermoCompTemp, ref thermoCompWei, ref thermoCompCAS);

我在询问问题之前尝试了每一个(对象 ref ),但是分开......

顺便说一下,传递Array类型时不使用 ref ,而不是使用 ref 关键字,可能是因为数组已经是引用。