russkij Geschrieben 3. Mai 2006 Geschrieben 3. Mai 2006 Hallo habe folgendes Problem: eine Funktion liefert mit ein _variant_t. in dem in einem "SAFAARRAY of R8" meine double-Werte stecken (ich kann die im debugger sehen) nur ich krieg die nicht raus. also _variant_t var = funktion(); double firstDouble = var??? sitze schon seit 2 Stunden und komme nicht wieter. währe seht dankbar für die Hilfe!! gruss
Kratzy974 Geschrieben 3. Mai 2006 Geschrieben 3. Mai 2006 So wie ich das lese solltest du eigendlich einfach mit "double value = (double)var;" darauf zugreifen können, da dieser entsprechende operatoren zur Verfügung stellt. Welchen Fehler bringt der Compiler, wenn du dies versuchst ?
russkij Geschrieben 3. Mai 2006 Autor Geschrieben 3. Mai 2006 Unhandled exception at 0x7c81eb33 in acad.exe: Microsoft C++ exception: _com_error at memory location 0x0b77f910.. das dürfte auch nicht funktionieren, weil in der var ja mehrere werte drin sind. trotzdem danke gruss
Kratzy974 Geschrieben 3. Mai 2006 Geschrieben 3. Mai 2006 Der _variant_t hat eine VARIANT enthalten, auf welche (nach msdn) über die Operatoren zB operator double() zugegriffen werden kann. Allerdings gilt dies für _variant_t, dies ist die kapselnde Klasse., nicht für VARIANT. Kannst du mir eine Beispielfunktion nennen, welche ein _variant_t zurückgibt ? (System oä). Zusatz : Die VARIANT scheint nur eine Variable (Daten) zu enhalten, welche in einem union als unterschiedliche Werte dargestellt werden kann.(zugriff variant.dblVal für Doublewerte, variant ist ein VARIANT).
Klotzkopp Geschrieben 3. Mai 2006 Geschrieben 3. Mai 2006 In dem Variant steckt kein double, sondern ein Safearray von doubles. Falls die Verwendung der ATL erlaubt ist, würde ich den pparray-Member des VARIANT in ein CComSafeArray packen. Darüber kann man dan recht einfach die einzelnen doubles rausholen.
russkij Geschrieben 3. Mai 2006 Autor Geschrieben 3. Mai 2006 danke, jetzt gehts: COleSafeArray dias(mein _variant_t); long bound; dias.GetUBound(1, &bound); double *myDias = new double[(int)bound]; for (long i = 0; i <= bound; ++i) dias.GetElement(&(long)i, &myDias); gruss
Kratzy974 Geschrieben 3. Mai 2006 Geschrieben 3. Mai 2006 Sorry, lerne das grad. ;-) Wie gesagt, eine VARIANT ist ein union. Dies kann auch ein SAFEARRAY aein, VARIANT.parray. Der Zugriff (per API) sollte mit SafeArrayAccessData stattfinden. (Beispiel aus MSDN) : psa -> SAFEARRAY ( = variant.parray) long i, j, min; BSTR bstrTemp; BSTR HUGEP *pbstr; HRESULT hr; // Get a pointer to the elements of the array. hr = SafeArrayAccessData(psa, (void HUGEP**)&pbstr); if (FAILED(hr)) goto error; // Selection sort. for (i = 0; i < psa->rgsabound.cElements-1; i++) { min = i; for (j = i+1; j < psa->rgsabound.cElements; j++) { if (wcscmp(pbstr[j], pbstr[min]) < 0) min = j; } // Swap array[min] and array. bstrTemp = pbstr[min]; pbstr[min] = pbstr; pbstr = bstrTemp; } SafeArrayUnaccessData(psa);
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden