Получение значений свойств класса с помощью 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 С уважением.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]