Похоже, ваша программа читает с отрицательного смещения нулевого указателя.Смещение отключено на единицу от смещения, в котором имя класса хранится в VMT, предполагая, что поле, в котором объект хранит указатель VMT , содержит адрес 1 вместо фактического адреса VMT своего класса.
Это ставит под вопрос, действительно ли вы сохранили действительную ссылку на объект в этом списке.Вы добавляете что-то к List
, но затем, чтобы проверить, что это работает, вы печатаете значение ClassName
какого-то объекта в FunctionHookList
.Какая причина верить, что это один и тот же объект?Проверьте, как вы сконструировали объект, а затем проверьте оператор присваивания, который присваивает значение переменной aCreatedObject
.Ищите сомнительные операции с памятью, например, вызывая Move
или TStream.Read
, где вы указали неправильный указатель назначения или неправильный счетчик байтов, перезаписывая, таким образом, часть объекта.
Чтобы выяснить, что происходитвызовите функцию ClassType
для объекта в списке.(Это обычно безопасно вызывать, потому что пока указатель хранится в ссылочных точках объекта где-то , вы получите значение. Может быть, не допустимое значение, но по крайней мере ононе вылетит.) Сравните результат с классом, который вы ожидаете в списке.Например, если вы сохранили TFont
в списке, проверьте это:
tmp := list.Objects[i];
if tmp.ClassType <> TFont then
ShowMessage(Format('Expected %p but got %p instead',
[Pointer(TFont), Pointer(tmp.ClassType)]));