[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-Code

    Dim 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


Anmelden zum Antworten