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 Zitieren
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 ? Zitieren
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 Zitieren
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). Zitieren
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. Zitieren
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 Zitieren
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); Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.