[solved] ActiveX soll Array zurückgeben
-
Hallo,
ein AktiveX (Server) soll an seinen aufrufenden Client ein Double-Array zurückgeben. Da man Arrays nicht direkt übergeben kann, muss das Array in einem anderen Typ gewrapped werden. Hierzu kommen eigentlich nur zwei in Frage:
BSTR oder per Variant.
Variant sieht besser aus (keine Verfälschung durch Typenumwandlung) -
Allerdings möchte ich nun im Variant ein SafeArray aus Doubles
anlegen - nur gelingt mir dies nicht.Hat einer von Euch ein paar Beispielzeilen oder eine alternative Idee?
Worst case ist Daten auf Platte schreiben und wieder auslesen -
aber das kanns ja nicht sein, oder?Grüße
Florian
-
Das mit dem SafeArray funktioniert schon. Ich habs mal getestet:
VARIANT CMySAActiveXCtrl::GetDblSafeArray(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); VARIANT vaResult; VariantInit(&vaResult); SAFEARRAY* psa = SafeArrayCreateVector( VT_R8, 0, 20 ); if ( psa!=NULL ) { double* data; if ( SUCCEEDED(SafeArrayAccessData( psa, (void**)&data ) ) ) { for( ULONG i=0 ; i<psa->rgsabound[0].cElements; i++ ) data[psa->rgsabound[0].lLbound+i] = 1.0 * i + ( (psa->rgsabound[0].cElements-i) / 10.0 ); } else { SafeArrayDestroy(psa); psa = NULL; } } if ( psa != NULL ) { V_VT(&vaResult) = VT_ARRAY|VT_R8; V_ARRAY(&vaResult) = psa; } return vaResult; }Unter VB
konnte ich auf die Methode GetDblSafeArray zugreifen und die hat mit die Daten zurückgeliefert. Hier der VB-CodeDim result As Object Dim item As Double result = myax.GetDblSafeArray() For Each item In result MsgBox(item.ToString()) Next
-
Das war Rekordzeit - 1000 Dank.
Solltest Du mal nach München kommen, wirst Du von mir auf ein Bier eingeladen
Grüße aus dem wilden Süden,
Flo