2010-03-01 76 views
6

是否有任何易於使用高級類或庫,讓你在Visual C與VARIANT小號互動++?一個簡單的方法轉換到/從C++ VARIANT類型

更具體而言,我想POD類型(例如doublelong),字符串(例如CString)和容器(例如std::vector)和VARIANT S之間轉換。例如:

long val = 42; 
VARIANT var; 
if (ToVariant(val, var)) ...  // tries to convert long -> VARIANT 
comObjPtr->someFunc(var); 

std::vector<double> vec; 
VARIANT var = comObjPtr->otherFunc(); 
if (FromVariant(var, vec)) ... // tries VARIANT -> std::vector<double> 

我(?天真地)假定人們COM工作做這一切的時候,所以很可能是一個方便的庫,處理各種轉換。但是,所有的,我已經能夠找到的是包裝類的一羣魚龍混雜,每個轉換幾類:

有沒有什麼簡單的方法 - 短的切換到Visual Basic - 爲了避免尷尬的管理內存中的這個噩夢ment and bitwise VT_ARRAY | VT_I4的代碼?

相關問題:

+0

這個問題並不適用於[C++](它沒有那個構造),只是視覺方言。 – dmckee 2010-03-01 21:26:47

+0

@dmckee:對,你是。 – 2010-03-01 22:39:12

+0

對於任何對POD意味着什麼的人來說,這是一個堆棧溢出的答案。 http://stackoverflow.com/questions/146452/what-are-pod-types-in-c – 2013-08-25 14:03:48

回答

4

好了,最艱難的工作已經完成了你的各種包裝類。我更喜歡_variant_t和_bstr_t,因爲它們更適合轉換爲POD類型和字符串。對於簡單的數組,您真正需要的是模板轉換函數。像下面這樣:

// parameter validation and error checking omitted for clarity 
template<typename T> 
void FromVariant(VARIANT Var, std::vector<T>& Vec) 
{ 
    CComSafeArray<T> SafeArray; 
    SafeArray.Attach(Var.parray); 
    ULONG Count = SafeArray.GetCount(); 
    Vec.resize(Count); 
    for(ULONG Index = 0; Index < Count; Index++) 
    { 
     Vec[Index] = SafeArray[Index]; 
    } 
} 
.... 
std::vector<double> Vec; 
VARIANT Var = ...; 
FromVariant(Var, Vec); 
... 

當然事物中會很麻煩(在問候內存/生命週期管理)如果數組包含非POD類型,但它仍然是可行的。

+0

謝謝 - 這很有用,而且我已經辭去了自己的工作。就像你說的,缺少的是非POD支持,也可能是類型檢查/強制(例如,將雙精度的變體轉換爲整數的向量)。 – 2010-03-08 13:09:36

相關問題