Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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 ?

Geschrieben

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

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben

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

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...