Ejemplo n.º 1
0
        public Object GetValue()
        {
            Object       pRetVal = null;
            IDebugBinder binder  = this.m_Context.Binder;

            if (null == this.m_RuntimeType)
            {
                binder.ResolveRuntimeType(this.m_Object, out this.m_RuntimeType);
            }
            if (null != this.m_RuntimeType)
            {
                IDebugObject    pObject   = this.m_Object;
                IDebugField     type      = this.m_RuntimeType;
                IDebugEnumField enumField = null;

                enumField = this.m_RuntimeType as IDebugEnumField;
                if (null != enumField)
                {
                    IDebugField underlyingField = null;
                    enumField.GetUnderlyingSymbol(out underlyingField);
                    if (null != underlyingField)
                    {
                        IDebugObject underlyingObject = null;
                        binder.Bind(this.m_Object, underlyingField, out underlyingObject);
                        if (null != underlyingObject)
                        {
                            pObject = underlyingObject;
                        }

                        IDebugField underlyingType = null;
                        underlyingField.GetType(out underlyingType);
                        if (null != underlyingType)
                        {
                            type = underlyingType;
                        }
                    }
                }

                if (null != pObject)
                {
                    uint size = 0;
                    pObject.GetSize(out size);
                    if (0 < size)
                    {
                        byte[] valueBytes = new byte[size];
                        if (null != valueBytes)
                        {
                            pObject.GetValue(valueBytes, size);
                            if (null != valueBytes)
                            {
                                FIELD_KIND fieldKind = 0;
                                type.GetKind(out fieldKind);
                                if (0 != fieldKind)
                                {
                                    if (0 != (fieldKind & FIELD_KIND.FIELD_TYPE_PRIMITIVE))
                                    {
                                        FIELD_INFO fieldInfo;
                                        type.GetInfo(FIELD_INFO_FIELDS.FIF_NAME, out fieldInfo);
                                        if (null != fieldInfo.bstrName)
                                        {
                                            switch (size)
                                            {
                                            case 1:
                                                if (0 == String.Compare("whole", fieldInfo.bstrName, true))
                                                {
                                                    pRetVal = valueBytes[0];
                                                }
                                                else if (0 == String.Compare("uwhole", fieldInfo.bstrName, true))
                                                {
                                                    pRetVal = valueBytes[0];
                                                }
                                                break;

                                            case 2:
                                                if (0 == String.Compare("whole", fieldInfo.bstrName, true))
                                                {
                                                    UInt16 temp = 0;
                                                    for (int i = 0; i < 2; i++)
                                                    {
                                                        temp <<= 8;
                                                        temp  |= valueBytes[1 - i];
                                                    }
                                                    pRetVal = (Int16 )temp;

                                                    //pRetVal->vt = VT_I2;
                                                    //pRetVal->iVal = *reinterpret_cast<SHORT*>(valueBytes);
                                                }
                                                else if (0 == String.Compare("char", fieldInfo.bstrName, true))
                                                {
                                                    UInt16 temp = 0;
                                                    for (int i = 0; i < 2; i++)
                                                    {
                                                        temp <<= 8;
                                                        temp  |= valueBytes[1 - i];
                                                    }
                                                    pRetVal = temp;
                                                    //pRetVal->vt = VT_UI2;
                                                    //pRetVal->uiVal = *reinterpret_cast<USHORT*>(valueBytes);
                                                }
                                                else if (0 == String.Compare("uwhole", fieldInfo.bstrName, true))
                                                {
                                                    UInt16 temp = 0;
                                                    for (int i = 0; i < 2; i++)
                                                    {
                                                        temp <<= 8;
                                                        temp  |= valueBytes[1 - i];
                                                    }
                                                    pRetVal = temp;
                                                    //pRetVal->vt = VT_UI2;
                                                    //pRetVal->uiVal = *reinterpret_cast<USHORT*>(valueBytes);
                                                }
                                                break;

                                            case 4:
                                                if (0 == String.Compare("whole", fieldInfo.bstrName, true))
                                                {
                                                    Int32 temp = 0;
                                                    for (int i = 0; i < 4; i++)
                                                    {
                                                        temp <<= 8;
                                                        temp  |= valueBytes[3 - i];
                                                    }
                                                    pRetVal = temp;
                                                    //pRetVal->vt = VT_I4;
                                                    //pRetVal->lVal = *reinterpret_cast<LONG*>(valueBytes);
                                                }
                                                else if (0 == String.Compare("uwhole", fieldInfo.bstrName, true))
                                                {
                                                    UInt32 temp = 0;
                                                    for (int i = 0; i < 4; i++)
                                                    {
                                                        temp <<= 8;
                                                        temp  |= valueBytes[3 - i];
                                                    }
                                                    pRetVal = temp;
                                                    //pRetVal->vt = VT_UI4;
                                                    //pRetVal->ulVal = *reinterpret_cast<ULONG*>(valueBytes);
                                                }
                                                else if (0 == String.Compare("real", fieldInfo.bstrName, true))
                                                {
                                                    Int32 temp = 0;
                                                    for (int i = 0; i < 4; i++)
                                                    {
                                                        temp <<= 8;
                                                        temp  |= valueBytes[3 - i];
                                                    }
                                                    pRetVal = temp;
                                                    //pRetVal->vt = VT_R4;
                                                    //pRetVal->fltVal = *reinterpret_cast<FLOAT*>(valueBytes);
                                                }
                                                break;

                                            case 8:
                                                if (0 == String.Compare("whole", fieldInfo.bstrName, true))
                                                {
                                                    //pRetVal->vt = VT_I8;
                                                    //pRetVal->llVal = *reinterpret_cast<LONGLONG*>(valueBytes);
                                                }
                                                else if (0 == String.Compare("uwhole", fieldInfo.bstrName, true))
                                                {
                                                    //pRetVal->vt = VT_UI8;
                                                    //pRetVal->ullVal = *reinterpret_cast<ULONGLONG*>(valueBytes);
                                                }
                                                else if (0 == String.Compare("real", fieldInfo.bstrName, true))
                                                {
                                                    //pRetVal->vt = VT_R8;
                                                    //pRetVal->dblVal = *reinterpret_cast<DOUBLE*>(valueBytes);
                                                }
                                                break;
                                            }

                                            if (0 == String.Compare("bool", fieldInfo.bstrName, true))
                                            {
                                                //pRetVal->vt = VT_BOOL;
                                                pRetVal = false;
                                                for (uint i = 0; i < size; i++)
                                                {
                                                    if (valueBytes[i] != 0)
                                                    {
                                                        pRetVal = true;
                                                    }
                                                }
                                            }
                                            else if (0 == String.Compare("string", fieldInfo.bstrName, true))
                                            {
                                                //VSASSERT(size >= 2, "String length is too short");
                                                //VSASSERT(size % 2 == 0, "String of odd byte length");
                                                //UINT chars = (size-2)/2; // Debug engine adds 2 for terminating L'\0'
                                                //pRetVal->vt = VT_BSTR;
                                                //pRetVal->bstrVal = SysAllocStringLen(NULL, chars);
                                                //wcsncpy(pRetVal->bstrVal, reinterpret_cast<WCHAR*>(valueBytes), chars);
                                                //pRetVal->bstrVal[chars] = L'\0';
                                                pRetVal = (new System.Text.UnicodeEncoding()).GetString(valueBytes);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(pRetVal);
        }
Ejemplo n.º 2
0
 public  CDebugEnumType(IDebugEnumField enumField, IDebugContext context) : base(enumField as IDebugField, context) {
   this.m_EnumField = enumField;
 }