Пример #1
0
        public void SetValue(object obj)
        {
            vt = (short)VarEnum.VT_EMPTY;
            if (obj == null)
            {
                return;
            }

            Type t = obj.GetType();

            if (t.IsEnum)
            {
                t = Enum.GetUnderlyingType(t);
            }

            if (t == typeof(sbyte))
            {
                vt   = (short)VarEnum.VT_I1;
                cVal = (sbyte)obj;
            }
            else if (t == typeof(byte))
            {
                vt   = (short)VarEnum.VT_UI1;
                bVal = (byte)obj;
            }
            else if (t == typeof(short))
            {
                vt   = (short)VarEnum.VT_I2;
                iVal = (short)obj;
            }
            else if (t == typeof(ushort) || t == typeof(char))
            {
                vt    = (short)VarEnum.VT_UI2;
                uiVal = (ushort)obj;
            }
            else if (t == typeof(int))
            {
                vt   = (short)VarEnum.VT_I4;
                lVal = (int)obj;
            }
            else if (t == typeof(uint))
            {
                vt    = (short)VarEnum.VT_UI4;
                ulVal = (uint)obj;
            }
            else if (t == typeof(long))
            {
                vt    = (short)VarEnum.VT_I8;
                llVal = (long)obj;
            }
            else if (t == typeof(ulong))
            {
                vt     = (short)VarEnum.VT_UI8;
                ullVal = (ulong)obj;
            }
            else if (t == typeof(float))
            {
                vt     = (short)VarEnum.VT_R4;
                fltVal = (float)obj;
            }
            else if (t == typeof(double))
            {
                vt     = (short)VarEnum.VT_R8;
                dblVal = (double)obj;
            }
            else if (t == typeof(string))
            {
                vt      = (short)VarEnum.VT_BSTR;
                bstrVal = Marshal.StringToBSTR((string)obj);
            }
            else if (t == typeof(bool))
            {
                vt   = (short)VarEnum.VT_BOOL;
                lVal = ((bool)obj) ? -1 : 0;
            }
            else if (t == typeof(BStrWrapper))
            {
                vt      = (short)VarEnum.VT_BSTR;
                bstrVal = Marshal.StringToBSTR(((BStrWrapper)obj).WrappedObject);
            }
            else if (t == typeof(CurrencyWrapper))
            {
                vt    = (short)VarEnum.VT_CY;
                llVal = Decimal.ToOACurrency(((CurrencyWrapper)obj).WrappedObject);
            }
            else if (t == typeof(DateTime))
            {
                vt     = (short)VarEnum.VT_DATE;
                dblVal = ((DateTime)obj).ToOADate();
            }
            else if (t == typeof(Decimal))
            {
                vt = (short)VarEnum.VT_DECIMAL;
                int[] parts = Decimal.GetBits((Decimal)obj);
                decVal.scale = (byte)((parts[3] >> 16) & 0x7F);
                decVal.sign  = (byte)(parts[3] >> 24);
                decVal.Hi32  = parts[2];
                decVal.Lo64  = (uint)parts[0] | ((ulong)(uint)parts[1] << 32);
            }
            else if (t == typeof(ErrorWrapper))
            {
                vt   = (short)VarEnum.VT_ERROR;
                lVal = ((ErrorWrapper)obj).ErrorCode;
            }
#if FEATURE_COMINTEROP
            else if (t == typeof(UnknownWrapper))
            {
                vt       = (short)VarEnum.VT_UNKNOWN;
                pdispVal = Marshal.GetIUnknownForObject(((UnknownWrapper)obj).WrappedObject);
            }
            else if (t == typeof(DispatchWrapper))
            {
                vt       = (short)VarEnum.VT_DISPATCH;
                pdispVal = Marshal.GetIDispatchForObject(((DispatchWrapper)obj).WrappedObject);
            }
#endif
            else if (t.UnderlyingSystemType.IsArray)
            {
                int tmp;
                pdispVal = SafeArrayFromArrayInternal((Array)obj, out tmp);
                vt       = (short)(tmp | (int)VarEnum.VT_ARRAY);
            }
            else
            {
#if !FEATURE_COMINTEROP
                throw new NotImplementedException(string.Format("Variant couldn't handle object of type {0}", obj.GetType()));
#else
                try
                {
                    pdispVal = Marshal.GetIDispatchForObject(obj);
                    vt       = (short)VarEnum.VT_DISPATCH;
                    return;
                }
                catch { }
                try
                {
                    vt       = (short)VarEnum.VT_UNKNOWN;
                    pdispVal = Marshal.GetIUnknownForObject(obj);
                }
                catch (Exception ex)
                {
                    throw new NotImplementedException(string.Format("Variant couldn't handle object of type {0}", obj.GetType()), ex);
                }
#endif
            }
        }
Пример #2
0
 // Constructs a Currency from a Decimal value.
 //
 public Currency(Decimal value)
 {
     m_value = Decimal.ToOACurrency(value);
 }
Пример #3
0
        public static void SetValueAt(object obj, int vt, IntPtr addr)
        {
            Type t = obj.GetType();

            switch ((VarEnum)vt)
            {
            case VarEnum.VT_I1:
                *((sbyte *)addr) = (sbyte)obj;
                break;

            case VarEnum.VT_UI1:
                *((byte *)addr) = (byte)obj;
                break;

            case VarEnum.VT_I2:
                *((short *)addr) = (short)obj;
                break;

            case VarEnum.VT_UI2:
                *((ushort *)addr) = (ushort)obj;
                break;

            case VarEnum.VT_INT:
            case VarEnum.VT_I4:
                *((int *)addr) = (int)obj;
                break;

            case VarEnum.VT_UINT:
            case VarEnum.VT_UI4:
                *((uint *)addr) = (uint)obj;
                break;

            case VarEnum.VT_I8:
                *((long *)addr) = (long)obj;
                break;

            case VarEnum.VT_UI8:
                *((ulong *)addr) = (ulong)obj;
                break;

            case VarEnum.VT_R4:
                *((float *)addr) = (float)obj;
                break;

            case VarEnum.VT_R8:
                *((double *)addr) = (double)obj;
                break;

            case VarEnum.VT_BOOL:
                *((short *)addr) = (short)((bool)obj ? -1 : 0);
                break;

            case VarEnum.VT_BSTR:
                if (t == typeof(BStrWrapper))
                {
                    *((IntPtr *)addr) = Marshal.StringToBSTR(((BStrWrapper)obj).WrappedObject);
                }
                else
                {
                    *((IntPtr *)addr) = Marshal.StringToBSTR((string)obj);
                }
                break;

            case VarEnum.VT_CY:
                if (t == typeof(CurrencyWrapper))
                {
                    *((long *)addr) = Decimal.ToOACurrency(((CurrencyWrapper)obj).WrappedObject);
                }
                else
                {
                    *((long *)addr) = Decimal.ToOACurrency((Decimal)obj);
                }
                break;

            case VarEnum.VT_DATE:
                *((double *)addr) = ((DateTime)obj).ToOADate();
                break;

            case VarEnum.VT_DECIMAL:
            {
                int[]    parts = Decimal.GetBits((Decimal)obj);
                DECIMAL *dec   = (DECIMAL *)addr;
                dec->scale = (byte)((parts[3] >> 16) & 0x7F);
                dec->sign  = (byte)(parts[3] >> 24);
                dec->Hi32  = parts[2];
                dec->Lo64  = (uint)parts[0] | ((ulong)(uint)parts[1] << 32);
                break;
            }

            case VarEnum.VT_ERROR:
                if (t == typeof(ErrorWrapper))
                {
                    *((int *)addr) = ((ErrorWrapper)obj).ErrorCode;
                }
                else
                {
                    *((int *)addr) = (int)obj;
                }
                break;

            case VarEnum.VT_VARIANT:
            {
                Variant v = default(Variant);
                v.SetValue(obj);
                *((Variant *)addr) = v;
                break;
            }

#if FEATURE_COMINTEROP
            case VarEnum.VT_UNKNOWN:
                if (t == typeof(UnknownWrapper))
                {
                    *((IntPtr *)addr) = Marshal.GetIUnknownForObject(((UnknownWrapper)obj).WrappedObject);
                }
                else
                {
                    *((IntPtr *)addr) = Marshal.GetIUnknownForObject(obj);
                }
                break;

            case VarEnum.VT_DISPATCH:
                if (t == typeof(DispatchWrapper))
                {
                    *((IntPtr *)addr) = Marshal.GetIDispatchForObject(((DispatchWrapper)obj).WrappedObject);
                }
                else
                {
                    *((IntPtr *)addr) = Marshal.GetIDispatchForObject(obj);
                }
                break;
#endif
            default:
                if (((VarEnum)vt & VarEnum.VT_ARRAY) != 0)
                {
                    int tmp;
                    *((IntPtr *)addr) = SafeArrayFromArrayInternal((Array)obj, out tmp);
                    break;
                }
                throw new NotImplementedException(string.Format("Variant.SetValueAt couldn't handle VT {0}", vt));
            }
        }
		public static Int64 ToOACurrency(this Decimal value)
		{
			return Decimal.ToOACurrency(value);
		}