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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

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