Я не знаю, почему вы делаете это с PHP вместо того, чтобы делать все, что вам нужно в вашем приложении C #, но вы можете сделать это, запустив скрытый процесс вызова командной строки, например:
var startInfo = new System.Diagnostics.ProcessStartInfo
{
WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
FileName = "cmd.exe",
Arguments = "/C php <yourscript>"
};
var process = new System.Diagnostics.Process
{
StartInfo = startInfo
};
process.Start();
[113 ] и затем читаем вывод:
var output = process.StandardOutput.ReadToEnd();
Какую структуру 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 и ранее) на всех объектах TO, которые отрицательно смещены от самого указателя VMT.
Вот причина ссылки на vmtParent.
Наконец, используя ссылку на класс TClass, вы можете передать любой производный класс TObject в эту функцию и получить количество виртуальных методов.
Я был почти уверен, что у Халварда было что-то на ВМТ. Конечно же, у него есть Хак № 8: явные вызовы VMT , в которых упоминается Рэй Лишнер Секреты Delphi 2 и Delphi в двух словах .
Вот его Взломанная версия VMT
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;
Вам нужно будет прочитать его статью, чтобы узнать больше о взломе.
Поиск в Google :-P для "delphi vmt" дает this . Может быть, это даст вам начало.
Я добавлю свой собственный сайт для этого:
Что такое таблица виртуальных методов? [12117 Я думаю, что это точно с Delphi 2005.
VMT не имеет никакого значения, дающего количество указателей виртуальных методов, которые он содержит. Ничто, кроме компилятора, не должно знать эту информацию, поэтому нет причин записывать ее для использования во время выполнения.
Я помню, что была какая-то информация о delphi vmt в книге «delphi in a кратко». Вы можете начать с delphi в двух словах, глава 2 или , это