Solved

Creating SAFEARRAY with multiple data types.

Posted on 2000-05-08
4
624 Views
Last Modified: 2011-04-14
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
Comment
Question by:cdgough
  • 2
4 Comments
 
LVL 1

Expert Comment

by:ntdragon
ID: 2790062
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
 

Author Comment

by:cdgough
ID: 2790496
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
 
LVL 1

Accepted Solution

by:
sharonk earned 100 total points
ID: 2791510
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
 

Author Comment

by:cdgough
ID: 2794849
This is exactly what I was looking for. Thanks.
0

Featured Post

What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

Join & Write a Comment

In days of old, returning something by value from a function in C++ was necessarily avoided because it would, invariably, involve one or even two copies of the object being created and potentially costly calls to a copy-constructor and destructor. A…
C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now