В файле System.pas содержится достаточное количество информации о смещенных смещениях VMT, но, похоже, он фактически не говорит о структуре самого VMT. Мне бы хотелось узнать, есть ли способ узнать размер VMT во время выполнения, или, другими словами, сколько виртуальных методов существует для данного класса?Где я могу найти информацию о структуре Delphi VMT?
ответ
Как насчет структуры VMT, которую вы хотите знать? Вы также знаете, что это внутренняя деталь реализации, которая может быть изменена (и со временем изменилась).
Чтобы ответить на конкретный вопрос, вот простой способ найти количество виртуальных методов данного класса:
function GetVirtualMethodCount(AClass: TClass): Integer;
begin
Result := (PInteger(Integer(AClass) + vmtClassName)^ -
(Integer(AClass) + vmtParent) - SizeOf(Pointer)) div SizeOf(Pointer);
end;
Это работает, потому что я знаю, что строка, представляющая имя класса помещается сразу после всех векторов виртуальных методов в VMT.
Я также знаю, что существует 11 виртуальных методов (для D2009, 9 для D2007 и ранее) для всех TObject, которые отрицательно смещены от самого указателя VMT.
В этом причина ссылки vmtParent.
Наконец, используя ссылку класса TClass, вы можете передать любой производный класс TObject в эту функцию и получить количество виртуальных методов.
Googling: -P для "delphi vmt" дает this. Возможно, это дает вам начало.
* Улыбка * Я люблю Hallvard! Он хорош в таких трюках. К сожалению, он определяет пользовательские виртуальные объекты как «массив [0..999]», или, другими словами, «больше, чем когда-либо понадобится». Я ищу способ найти фактический размер. –
Я помню, что была некоторая информация о delphi vmt в книге «Дельфы в двух словах». u можете начать с delphi in a nutshell chapter 2 или this
я подключить свой собственный сайт для этого:
What is the virtual-method table?
Это точно, как в Delphi 2005, я думаю.
VMT не имеет никакого значения, указывающего количество указателей виртуального метода, которые он удерживает. Ничто, кроме компилятора, не должно знать эту информацию, поэтому нет причин записывать ее для использования во время выполнения.
Я был уверен, что у Hallvard есть что-то на VMT. Конечно же, у него есть Hack #8: Explicit VMT calls, который ссылается на Ray Lischner Секреты Delphi 2 и Delphi в двух словах.
Вот его изрубил версия ВМТ
type
PClass = ^TClass;
PSafeCallException = function (Self: TObject; ExceptObject:
TObject; ExceptAddr: Pointer): HResult;
PAfterConstruction = procedure (Self: TObject);
PBeforeDestruction = procedure (Self: TObject);
PDispatch = procedure (Self: TObject; var Message);
PDefaultHandler = procedure (Self: TObject; var Message);
PNewInstance = function (Self: TClass) : TObject;
PFreeInstance = procedure (Self: TObject);
PDestroy = procedure (Self: TObject; OuterMost: ShortInt);
PVmt = ^TVmt;
TVmt = packed record
SelfPtr : TClass;
IntfTable : Pointer;
AutoTable : Pointer;
InitTable : Pointer;
TypeInfo : Pointer;
FieldTable : Pointer;
MethodTable : Pointer;
DynamicTable : Pointer;
ClassName : PShortString;
InstanceSize : PLongint;
Parent : PClass;
SafeCallException : PSafeCallException;
AfterConstruction : PAfterConstruction;
BeforeDestruction : PBeforeDestruction;
Dispatch : PDispatch;
DefaultHandler : PDefaultHandler;
NewInstance : PNewInstance;
FreeInstance : PFreeInstance;
Destroy : PDestroy;
{UserDefinedVirtuals: array[0..999] of procedure;}
end;
Вы должны будете читать его статью для больше на взломе, хотя.
- 1. Где я могу найти информацию о структуре cmusphinx?
- 2. Где я могу найти информацию о System.Windows.Media.Media3D.Matrix3D?
- 3. Где я могу найти информацию о программировании контроллера DMA TMS320C64xx
- 4. Drupal, где я могу найти информацию о текущей активной теме?
- 5. Где я могу найти информацию о синтаксисе column.status?
- 6. Где я могу найти информацию о Google Single Single Box?
- 7. Где я могу найти информацию о файлах IOCDS?
- 8. Где я могу найти информацию о стандарте Eclipse Architecture?
- 9. Где я могу найти техническую информацию о внутренних структурах JavaScript?
- 10. Где я могу найти основную информацию о RenderScript?
- 11. Где я могу найти информацию о предстоящих событиях разработчиков iPhone?
- 12. Где я могу найти информацию о настройке настраиваемых типов сообщений?
- 13. Где я могу найти информацию о шаблонах реализации NOSQL?
- 14. Где я могу найти информацию о специальных переменных Perl?
- 15. Где я могу найти информацию о синтаксисе в JS docs?
- 16. Где я могу найти информацию о алгоритмах роста строк?
- 17. Где я могу найти информацию о классе Html в ASP.net?
- 18. Где я могу найти информацию о блоках кода?
- 19. Где я могу найти дополнительную информацию о Fancytext от wxPython?
- 20. Где я могу найти информацию о внутренних компонентах Javascript?
- 21. Где я могу найти информацию о слоях и расширениях вулкана?
- 22. Где я могу найти информацию о лицензировании AppFabric?
- 23. Где я могу найти информацию о подписании файлов?
- 24. Где я могу найти информацию о редактировании содержимого профиля sharepoint?
- 25. Как я могу найти информацию о RoR?
- 26. Где я могу найти хорошую библиотеку delphi?
- 27. Где я могу найти информацию об Inotifier?
- 28. Где я могу найти подробный ресурс о структуре приложения с Laravel 4 и AngularJS?
- 29. Где я могу получить дополнительную информацию о файле wordpress comments.php?
- 30. Где найти информацию о типе Scala?
VmtEquals? Я никогда не слышал об этом раньше. Равен ли один из двух новых виртуальных методов в TObject для Delphi 2009? –
Да. Полагаю, для того, чтобы некоторые вещи, связанные с Generics, работали. –
Аллен: Это очень приятно! Только то, что я искал. Вы говорите, что структура может и может измениться.Какая версия (и) Delphi делает этот трюк? –