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); }
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); }