2015-02-23 154 views
0

我从来没有在C++中使用变体。但我正在维护旧的C++项目的代码。其中的一部分是将它或它的一部分翻译成C#。如何将没有VARIANT的C++方法与VARIANT转换为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数据类型。

+3

变体与COM对象一起使用。如果您使用的是COM,那么您可能需要使用变体。问题的大背景是什么? – 2015-02-23 11:33:07

+1

你有看这里吗? - > http://stackoverflow.com/questions/15806733/variant-datatype-of-c-into-c-sharp – 2015-02-23 11:34:20

+0

它主要破坏内存,调用者在猜测所需的pArray大小时没有很好的可能性。不要使用它。在C#中将变体转换为byte []很简单,只需将其转换即可。 – 2015-02-23 11:36:32

回答

1

VARIANT是COM事情,而不是C++的事情。如果您正在从变体中移除,则可能无需逐字翻译此方法。

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

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

你可以从C#调用COM,所以可能不需要翻译代码。