如何将带有VARIANT的C++方法转换为不带VARIANT的C#

How to translate a C++ method with VARIANT to C# without VARIANT?

本文关键字:VARIANT 转换 方法 C++      更新时间:2023-10-16

我从未使用过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数据类型。

VARIANT是COM的东西,而不是C++的东西。如果你正在远离变体,你可能不需要逐字逐句地翻译这个方法。

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

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

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