Veröffentlicht 3. Mai 200619 j 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
3. Mai 200619 j 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 ?
3. Mai 200619 j Autor 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
3. Mai 200619 j 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).
3. Mai 200619 j 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.
3. Mai 200619 j Autor 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
3. Mai 200619 j 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);
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.