public static ItemPropertyValue[] ReadItemPropertyValues(int size, IntPtr dataPtr, IntPtr errorsPtr)
        {
            try
            {
                var results = new ItemPropertyValue[size];
                var dataPtrAsLong = dataPtr.ToInt64();
                for (var i = 0; i < size; i++)
                {
                    var valuePtr = new IntPtr(dataPtrAsLong + i * NativeMethods.VariantSize);
                    if (valuePtr != IntPtr.Zero)
                    {
                        results[i].Value = Marshal.GetObjectForNativeVariant(valuePtr);
                        NativeMethods.VariantClear(valuePtr);
                    }
                    results[i].Error = Marshal.ReadInt32(errorsPtr, i * sizeof(int));
                }

                return results;
            }
            finally
            {
                if (dataPtr != IntPtr.Zero)
                    Marshal.FreeCoTaskMem(dataPtr);
                if (errorsPtr != IntPtr.Zero)
                    Marshal.FreeCoTaskMem(errorsPtr);
            }            
        }
        public static ItemPropertyValue[] ReadItemPropertyValues(int size, IntPtr dataPtr, IntPtr errorsPtr)
        {
            try
            {
                var results       = new ItemPropertyValue[size];
                var dataPtrAsLong = dataPtr.ToInt64();
                for (var i = 0; i < size; i++)
                {
                    var valuePtr = new IntPtr(dataPtrAsLong + i * NativeMethods.VariantSize);
                    if (valuePtr != IntPtr.Zero)
                    {
                        results[i].Value = Marshal.GetObjectForNativeVariant(valuePtr);
                        NativeMethods.VariantClear(valuePtr);
                    }
                    results[i].Error = Marshal.ReadInt32(errorsPtr, i * sizeof(int));
                }

                return(results);
            }
            finally
            {
                if (dataPtr != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(dataPtr);
                }
                if (errorsPtr != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(errorsPtr);
                }
            }
        }