Я пытаюсь получить значения полей в классе, используя 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
);
}
GetFieldProps
предоставляет только статическую информацию, поэтому pValue
& pcchValue
вероятно, относятся только к полям, представляющим константы.
Чтобы получить действительное значение из экземпляра, я считаю, что вам нужно использовать COR_FIELD_OFFSET.ulOffset
вернулся GetClassLayout
чтобы получить место в памяти относительно ObjectID (ObjectID является указателем на фактический экземпляр), и вы можете получить требуемый размер / интерпретацию, анализируя подпись, которая GetFieldProps
магазины в ppvSigBlob
а также pcbSigBlob
(формат которого определен в разделе 23.2.4 раздела II стандарта ECMA-335).
GetClassLayout
чтобы найти расположение его компонентных полей.GetStringLayout
а также GetArrayObjectInfo
С уважением.Других решений пока нет …