Wie VARIANT array auswerten?
-
Hallo.
Ich habe ein Problem mit dem Datentyp VARIANT, der für die Methode IWbemClassObject::Get benötigt wird.
http://msdn2.microsoft.com/en-us/library/aa391442(VS.85).aspxIch will jeden Wert, den diese VARIANT Variable jeweils enthält, in einen BSTR umwandeln.
//Beispiel //so funktioniert es für Nichtarrays HRESULT hResult; VARIANT vVariant; //vVariant eine int Zahl zuweisen vVariant.intVal = 123; //umwandeln in BSTR hResult = VariantChangeType(&vVariant, &vVariant, 0, VT_BSTR); //vVariant.bstr enthält jetzt den string "123"Das funktioniert auch so weit einwandfrei mit VariantChangeType, nur leider nicht bei Arrays eines Typs in VARIANT. Das Steht auch so ungefähr in der MSDN: "Arrays of one type cannot be converted to arrays of another type with this function."
http://msdn2.microsoft.com/en-us/library/ms221258(VS.85).aspxIch benutze diese Methoden für WMI wo eben einige WMI Klassen auch string Arrays, uint16 Arrays, uint32 Arrays,... verwenden.
Mein Frage ist, ob es Funktionen gibt die mir weiter helfen könnten oder wie ich denn die Größe des jeweiligen Arrays in VARIANT raus bekommen kann?
Ich programmiere unter Visual Studio 2005 Pro.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du musst eben jedes Array Eleemnt konvertieren.
Du hast Die Möglichkeit mit SafeArrayGetElement die Elemnte einzeln zu laden oder Du verwendest direkt SafeArrayAccessData und greifst dirket auf die Array Member zu.Dir ist klar, dass dieser Array, dann auch in dem Variant verpackt ist.
-
Ok vielen Dank erstmal. War auch schon etwas weiter gekommen.
Ja ich habe gesehen, das SAFEARRAY* und SAFEARRAY** dann auch in dem VARIANT enthalten sind.
Ist natürlich etwas bescheiden schön, dass man mit VariantChangeType die Typen ändern kann, bei einem SAFEARRAY aber trotzdem wieder allein einzeln prüfen udn konvertieren muss.
Ich hatte jetzt auf zum Beispiel ine BSTR Element so zugegriffenVARIANT &vVariant; BSTR bstrString; //vorrausgesetzt korrekte initialisierung und zuweisung des SAFEARRAY //in vVariant int iSize = (int)vVariant.parray->rgsabound->cElements; for( int i = 0; i < iSize; i++ ) { bstrString = ((BSTR*)vVariant.parray->pvData)[i]; //bstString verarbeitende Code //... }
-
Falsch. Das ist ein Array von Variants bei denen Du dann auf den BSTR zugreifen möchtest (sofern es einer ist, sonst ist noch ein Typechange notwendig).