[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 706
  • Last Modified:

Creating SAFEARRAY with multiple data types.

I want to create a safe array that contains different types of data. For example, I am trying to create a 2d array with legnth 4. I want all the elements array[0][0], array[0][1], array[0][2], array[0][3], to be BSTRs. I want all the elements array[1][0], array[1][1], array[1][2], array[1][3] to be floats. How can I create this array and set the elements correctly? Please provide sample code.

Here is what I have so far.

  VARIANT ChartData;
  VariantInit( &ChartData );
  ChartData.vt = VT_ARRAY | VT_VARIANT;

  SAFEARRAYBOUND rgb[] = { 4, 0 };
  SAFEARRAY *psa = SafeArrayCreate( VT_VARIANT, 2, rgb );

  if( psa )
  {
    long* data;

    SafeArrayAccessData( psa, ( void ** )&data );

    // SET ARRAY ELEMENTS!!?

    SafeArrayUnaccessData( psa );
  }

  ChartData.parray = psa;
0
cdgough
Asked:
cdgough
  • 2
1 Solution
 
ntdragonCommented:
you should build a template class named safearray
something like:

template <class T,int S>
class SafeArray:parent{
   T arr1[S];
public:
SafeArray(){}
T&operator[](int x){
//something like
   return arr1[x];
}
~SafeArray(){}
};

in main to make safearray of BSTRs
and another one for flosts

then to make a container in size two that cont[0] will the first safearray
and cont[1] the second

i hope you got the idea






0
 
cdgoughAuthor Commented:
This doesn't look right.

I need two different types of variants in the same array. A single array with some BSTRs and some floats.
0
 
sharonkCommented:
The following C++ code function creates a safearray like the one you requested (with BSTR and floats):

STDMETHODIMP CArrayTest::CreateArray(VARIANT *result)
{
      SAFEARRAY *psa;
      HRESULT hr;
      VARIANT var;            
      SAFEARRAYBOUND rgsabound[2];
      long element[2];
      char sz[256];
      int count;

      rgsabound[0].lLbound = 0;
      rgsabound[0].cElements = 10;
      rgsabound[1].lLbound = 0;
      rgsabound[1].cElements = 10;

      psa = SafeArrayCreate(VT_VARIANT, 2, rgsabound);
      if(psa == NULL)
            return E_FAIL;

      for(count = 0; count < 10; count++)
      {
            // Prepare BSTR value
            sprintf(sz, "Hello%d", count);
            V_BSTR(&var) = SysAllocString(_bstr_t(sz));
            V_VT(&var) = VT_BSTR;
            // Prepare position
            element[0] = 0;
            element[1] = count;
            // Put element
            hr = SafeArrayPutElement(psa, element, &var);                    
            if (!SUCCEEDED(hr))
                  return E_FAIL;
            VariantClear(&var);
                  
            // Prepare float value
            V_R4(&var) = (float)count;
            V_VT(&var) = VT_R4;
            // Prepare position
            element[0] = 1;
            element[1] = count;
            // Put element
            hr = SafeArrayPutElement(psa, element, &var);                    
            if (!SUCCEEDED(hr))
                  return E_FAIL;
            VariantClear(&var);                          
      }
            
      // Copy Results to return Value
      V_VT(result) = VT_ARRAY | VT_VARIANT;
      V_ARRAY(result) = psa;
      
      return S_OK;
}

The following VB code test this function (assuming it resides in an impleemented interface):

    Dim a As New ArrayTest
    x = a.CreateArray
    For i = 0 To 9
        MsgBox x(0, i) & " " & x(1, i)
    Next

0
 
cdgoughAuthor Commented:
This is exactly what I was looking for. Thanks.
0

Featured Post

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now