Получение значений свойств класса с помощью GetFieldProps

Я пытаюсь получить значения полей в классе, используя GetFieldProps

Изначально я пользуюсь GetClassLayout чтобы получить массив токенов FieldDef, а затем перечислить их, используя GetFieldProps,

Результат каждого GetFieldProps возврат звонка S_OK и заполняет имя поля в szField,

Я звоню, пытаясь это в ExceptionThrown обратный вызов, и при попытке сделать это для исключения, он возвращает имена полей _className, _message и т.д., но ppValue всегда пусто, как есть pcchValue,

Как я могу получить значение полей в классе?

Это пример моего текущего подхода (с удаленными объявлениями и т. Д.):

COR_FIELD_OFFSET* fieldTokensAndOffsets = new COR_FIELD_OFFSET[fieldArraySize];
m_info->GetClassLayout(
    classId,
    fieldTokensAndOffsets,
    fieldArraySize,
    &a,  
    &b);


for (int i = 0; i < fieldArraySize - 1; i++) {

    auto rid = fieldTokensAndOffsets[i].ridOfField;

    MetaDataImport->GetFieldProps(
        rid,
        &mb,
        fieldName,
        100,,
        &pchField,
        &pdwAttr,
        &ppvSigBlob,
        &pcbSigBlob,
        &pdwCPlusTypeFlag,
        &pValue,
        &pcchValue
    );
}

1 ответ

Решение

GetFieldProps предоставляет только статическую информацию, поэтому pValue & pcchValue вероятно, относятся только к полям, представляющим константы.

Чтобы получить действительное значение из экземпляра, я считаю, что вам нужно использовать COR_FIELD_OFFSET.ulOffset вернулся GetClassLayout чтобы получить место в памяти относительно ObjectID (ObjectID является указателем на фактический экземпляр), и вы можете получить требуемый размер / интерпретацию, анализируя подпись, которая GetFieldProps магазины в ppvSigBlob а также pcbSigBlob (формат которого определен в разделе 23.2.4 раздела II стандарта ECMA-335).

  • Если тип является примитивным типом значения, то размер и интерпретация должны быть очевидными (например, Int32 будет 4-байтовым целым числом).
  • Если тип является ссылочным типом, то это будет собственное поле размера int, содержащее ObjectID.
  • Если тип является перечислением, то он будет иметь размер своего базового типа (раздел 14.3 раздела II ECMA-335).
  • Если тип не является примитивным типом, то вы можете использовать GetClassLayout чтобы найти расположение его компонентных полей.
  • Вы можете получить дальнейшую разбивку строк и массивов, используя GetStringLayout а также GetArrayObjectInfo С уважением.
Другие вопросы по тегам