如何通过COM将SAFEARRAY从C ++传递到C#

时间:2019-12-03 11:55:13

标签: c# c++ com

我正在编写使用COM接口连接ECAD系统的C ++代码。我正在尝试获得ECAD系统使用的材料清单。

问题在于,API的文档适用于C#:

Fuction to extract material list from ECAD-System when using c#

当我在C ++中调用此函数时,声明如下:

void Physics_GetMaterialList(SAFEARRAY * * saMaterials)
{
    static BYTE parms[] = VTS_UNKNOWN;
    InvokeHelper(0xf, DISPATCH_METHOD, VT_EMPTY, nullptr, parms, saMaterials);
}

此声明向我提出了一些问题:

  • 我不是真的很喜欢SAFEARRAY,但是据我的尝试所显示的,我总是需要声明一个我不知道的SAFEARRAY的长度(以后是使用的材料的数量)。我调用此函数的那一刻。

  • 我不知道用于SAFEARRAY的类型(也许是VT_BSTR?)

到目前为止我的尝试:

try
{
    DWORD dwDims[] = {100};

    COleSafeArray values;
    values.Create(VT_BSTR, 1, dwDims);

    SAFEARRAY* materialList = values.parray;

    Physics_GetMaterialList(&materialList);
}
catch (CMemoryException* e)
{
}
catch (CFileException* e)
{
}
catch (CException* e)
{
}

在执行过程中会导致访问冲突。

关于如何将SAFEARRAY传递到C#中的System.Array中的C#的任何建议?

0 个答案:

没有答案