2015-02-23 71 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,所以可能不需要翻譯代碼。