コード例 #1
0
ファイル: PROPVARIANT..cs プロジェクト: nmoschkin/DataTools5
        /// <summary>
        /// Set a safe array value
        /// </summary>
        /// <param name="array">The new value to set.</param>
        internal void SetSafeArray(Array array)
        {
            if (array is null)
            {
                throw new ArgumentNullException("array");
            }

            const ushort vtUnknown = 13;
            var          psa       = PropVariantNativeMethods.SafeArrayCreateVector(vtUnknown, 0, (uint)array.Length);
            var          pvData    = PropVariantNativeMethods.SafeArrayAccessData(psa);

            try
            {
                // to remember to release lock on data
                for (int i = 0, l = array.Length; i < l; i++)
                {
                    var obj  = array.GetValue(i);
                    var punk = obj is object?Marshal.GetIUnknownForObject(obj) : IntPtr.Zero;

                    Marshal.WriteIntPtr(pvData, i * IntPtr.Size, punk);
                }
            }
            finally
            {
                PropVariantNativeMethods.SafeArrayUnaccessData(psa);
            }

            _valueType = (ushort)VarEnum.VT_ARRAY | (ushort)VarEnum.VT_UNKNOWN;
            _ptr       = psa;
        }