如何在不使用VARIANT的情况下将VARIANT的C ++方法转换为C#?

时间:2015-02-23 11:28:26

标签: c# c++ variant

我从未使用C ++中的变体。但我维护旧C ++项目的代码。部分原因是将其或部分内容翻译成C#。

我找到了使用变体的方法。我想"杀死"任何变体用于新项目版本。有人可以帮我解决怎么办?根据这个例子可能吗?我也不是C ++专家。我想知道这个方法在做什么(显然将变量转换为字节数组。但究竟是什么?数据在哪里等等?)

(示例)方法:

protected bool ConvertVariantToByteArray(VARIANT vtData, int lCount, BYTE[] pArray)
{
    if (vtData.vt != (VARENUM.VT_ARRAY | VARENUM.VT_UI1))
        return false;
    BYTE[] pSafeArrayData;
    if (FAILED(SafeArrayAccessData(vtData.parray, (void**) &pSafeArrayData)))
    {
        return false;
    }
    long lLbound;
    if (FAILED(SafeArrayGetLBound(vtData.parray, 1, &lLbound)))
    {
        SafeArrayUnaccessData(vtData.parray);
        return false;
    }
    long lUbound;
    if (FAILED(SafeArrayGetUBound(vtData.parray, 1, &lUbound)))
    {
        SafeArrayUnaccessData(vtData.parray);
        return false;
    }
    if (lCount < lUbound - lLbound + 1)
    {
        lCount = lUbound - lLbound + 1;
        SafeArrayUnaccessData(vtData.parray);
        return false;
    }
    for (long i = lLbound; i < lUbound + 1; ++i)
    {
        *pArray++ = *pSafeArrayData++;
    }
    SafeArrayUnaccessData(vtData.parray);
    lCount = lUbound - lLbound + 1;
    return true;
}

更大的背景:

应用程序通过Falcon库读取/写入EIB / KNX总线。似乎传入/来自总线的数据是VARIANT数据类型。

1 个答案:

答案 0 :(得分:1)

VARIANT是一个COM事物而不是C ++事物。如果您要远离变体,则可能不需要逐字翻译此方法。

VARIANT可以存储(alomst)任何内容,包括其他VARIANTS。您显示的代码将VARIANT转换为字节数组。

该数组在此示例中具有下限和上限(lboundubound) - 它们不需要从0开始运行。 for循环正在将数据复制到数组中。

您可以从C#调用COM,因此可能不需要翻译代码。