Esempio n. 1
0
        public object GetValue()
        {
            object obj = null;

            switch ((VarEnum)vt)
            {
            case VarEnum.VT_I1:
                obj = cVal;
                break;

            case VarEnum.VT_UI1:
                obj = bVal;
                break;

            case VarEnum.VT_I2:
                obj = iVal;
                break;

            case VarEnum.VT_UI2:
                obj = uiVal;
                break;

            case VarEnum.VT_ERROR:
            case VarEnum.VT_INT:
            case VarEnum.VT_I4:
                obj = lVal;
                break;

            case VarEnum.VT_UINT:
            case VarEnum.VT_UI4:
                obj = ulVal;
                break;

            case VarEnum.VT_I8:
                obj = llVal;
                break;

            case VarEnum.VT_UI8:
                obj = ullVal;
                break;

            case VarEnum.VT_R4:
                obj = fltVal;
                break;

            case VarEnum.VT_R8:
                obj = dblVal;
                break;

            case VarEnum.VT_BOOL:
                obj = !(boolVal == 0);
                break;

            case VarEnum.VT_BSTR:
                if (bstrVal != IntPtr.Zero)
                {
                    obj = Marshal.PtrToStringBSTR(bstrVal);
                }
                else
                {
                    obj = null;
                }
                break;

            case VarEnum.VT_CY:
                obj = Decimal.FromOACurrency(llVal);
                break;

            case VarEnum.VT_DATE:
                obj = DateTime.FromOADate(dblVal);
                break;

            case VarEnum.VT_DECIMAL:
                obj = new Decimal((int)decVal.Lo64, (int)(decVal.Lo64 >> 32), decVal.Hi32, decVal.sign != 0, decVal.scale);
                break;

            case VarEnum.VT_RECORD:
                throw new NotImplementedException("VT_RECORD not implemented");

#if FEATURE_COMINTEROP
            case VarEnum.VT_UNKNOWN:
            case VarEnum.VT_DISPATCH:
                if (pdispVal != IntPtr.Zero)
                {
                    obj = Marshal.GetObjectForIUnknown(pdispVal);
                }
                break;
#endif
            default:
                if (((VarEnum)vt & VarEnum.VT_BYREF) == VarEnum.VT_BYREF &&
                    pdispVal != IntPtr.Zero)
                {
                    obj = GetValueAt(vt & ~(short)VarEnum.VT_BYREF, pdispVal);
                }
                else if (((VarEnum)vt & VarEnum.VT_ARRAY) != 0)
                {
                    obj = SafeArrayToArrayInternal(pdispVal, vt & ~(short)VarEnum.VT_ARRAY);
                }
                break;
            }
            return(obj);
        }
Esempio n. 2
0
        public static object GetValueAt(int vt, IntPtr addr)
        {
            object obj = null;

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

            case VarEnum.VT_UI1:
                obj = Marshal.ReadByte(addr);
                break;

            case VarEnum.VT_I2:
                obj = Marshal.ReadInt16(addr);
                break;

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

            case VarEnum.VT_ERROR:
            case VarEnum.VT_INT:
            case VarEnum.VT_I4:
                obj = Marshal.ReadInt32(addr);
                break;

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

            case VarEnum.VT_I8:
                obj = Marshal.ReadInt64(addr);
                break;

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

            case VarEnum.VT_R4:
                obj = Marshal.PtrToStructure(addr, typeof(float));
                break;

            case VarEnum.VT_R8:
                obj = Marshal.PtrToStructure(addr, typeof(double));
                break;

            case VarEnum.VT_BOOL:
                obj = !(Marshal.ReadInt16(addr) == 0);
                break;

            case VarEnum.VT_BSTR:
            {
                IntPtr ptr = Marshal.ReadIntPtr(addr);
                if (ptr != IntPtr.Zero)
                {
                    obj = Marshal.PtrToStringBSTR(ptr);
                }
                else
                {
                    obj = null;
                }
                break;
            }

            case VarEnum.VT_CY:
                obj = Decimal.FromOACurrency(Marshal.ReadInt64(addr));
                break;

            case VarEnum.VT_DATE:
                obj = DateTime.FromOADate((double)Marshal.PtrToStructure(addr, typeof(double)));
                break;

            case VarEnum.VT_DECIMAL:
            {
                DECIMAL *dec = (DECIMAL *)addr;
                obj = new Decimal((int)dec->Lo64, (int)(dec->Lo64 >> 32), dec->Hi32, dec->sign != 0, dec->scale);
                break;
            }

            case VarEnum.VT_RECORD:
                throw new NotImplementedException("VT_RECORD not implemented");

// GetObjectForIUnknown is excluded from Marshal using FULL_AOT_RUNTIME
#if !DISABLE_COM
            case VarEnum.VT_UNKNOWN:
            case VarEnum.VT_DISPATCH:
            {
                IntPtr ifaceaddr = Marshal.ReadIntPtr(addr);
                if (ifaceaddr != IntPtr.Zero)
                {
                    obj = Marshal.GetObjectForIUnknown(ifaceaddr);
                }
                break;
            }
#endif
            case VarEnum.VT_VARIANT:
            {
                Variant v = *((Variant *)addr);
                obj = v.GetValue();
                break;
            }

            default:
                if (((VarEnum)vt & VarEnum.VT_ARRAY) != 0)
                {
                    obj = SafeArrayToArrayInternal(*((IntPtr *)addr), vt & ~(short)VarEnum.VT_ARRAY);
                }
                break;
            }
            return(obj);
        }