2010-03-01 6 views
6

es irgendwelche leicht zu bedien, High-Level-Klassen oder Bibliotheken mit denen Sie mit VARIANT s in Visual C++ zu interagieren?Ein einfacher Weg zu/von VARIANT Typen in C++ zu konvertieren

Genauer gesagt, würde Ich mag zwischen POD-Typen konvertieren (z double, long), Streicher (z CString) und Behälter (z std::vector) und VARIANT s. Zum Beispiel:

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> 

I (? Naiv) angenommen, dass Menschen mit COM tun dies die ganze Zeit arbeiten, so würde es höchstwahrscheinlich eine einzige bequeme Bibliothek sein, die alle Arten von Konvertierungen behandelt. Aber alles, was ich in der Lage gewesen zu finden, ist eine bunte Auswahl von Wrapper-Klassen, die jeweils konvertiert ein paar Typen:

gibt es eine einfache Art und Weise - kurz zu Visual Basic Schalt - diesen Alptraum umständlich Speicher zu vermeiden verwalten ment und bitweise VT_ARRAY | VT_I4 code?

Verwandte Fragen:

+0

Die Frage gilt nicht wirklich für [C++] (die dieses Konstrukt nicht hat), nur der visuelle Dialekt. – dmckee

+0

@dmckee: Richtig du bist. –

+0

Für alle, die neugierig sind, was POD hier bedeutet, ist eine Stack-Overflow-Antwort. http://StackOverflow.com/Questions/146452/what-are-pod-types-in-c –

Antwort

4

Nun wird der größte Teil der harten Arbeit für Sie bereits mit den verschiedenen Wrapper-Klassen erfolgen. Ich bevorzuge _variant_t und _bstr_t, da sie eher für die Konvertierung von/nach POD-Typen und Zeichenketten geeignet sind. Für einfache Arrays benötigen Sie nur die Template-Konvertierungsfunktion. Etwas wie folgt aus:

// 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); 
... 

Natürlich Dinge haarig (in Bezug auf Speicher-/Lebensdauer-Management), wenn das Array nicht-POD-Typen enthält, aber es ist immer noch machbar.

+0

Danke - das ist nützlich, und so ziemlich, was ich mich damit abgefunden habe. Wie Sie sagen, was fehlt, ist Nicht-POD-Unterstützung, und vielleicht Typ Überprüfung/Nötigung (z. B. konvertieren Sie eine Variante von Doppel zu einem Vektor von Ints). –

Verwandte Themen