Если вам не нужна поддержка ARM компилятор, вы можете найти другое решение here.
С встроенным ассемблером вы можете легко получить доступ к частному полю или методу.
Я думаю David's answer лучше в большинстве случаев, но если вам нужно быстрое решение для огромных класса, этот метод может быть более полезным.
Update (17 июня): Я только что заметил, что я забыл поделиться своим образец кода для доступ частных полей от его post. Прости.
unit UnitA;
type
THoge = class
private
FPrivateValue: Integer;
procedure PrivateMethod;
end;
end.
unit UnitB;
type
THogeHelper = class helper for THoge
public
function GetValue: Integer;
procedure CallMethod;
end;
function THogeHelper.GetValue: Integer;
asm
MOV EAX,Self.FPrivateValue
end;
procedure THogeHelper.CallMethod;
asm
CALL THoge.PrivateMethod
end;
Вот его пример кода для вызова частный метод.
type
THoge = class
private
procedure PrivateMethod (Arg1, Arg2, Arg3 : Integer);
end;
// Method 1
// Get only method pointer (if such there is a need to assign a method pointer to somewhere)
type
THogePrivateProc = procedure (Self: THoge; Arg1, Arg2, Arg3: Integer);
THogePrivateMethod = procedure (Arg1, Arg2, Arg3: Integer) of object;
function THogeHelper.GetMethodAddr: Pointer;
asm
{$ifdef CPUX86}
LEA EAX, THoge.PrivateMethod
{$else}
LEA RAX, THoge.PrivateMethod
{$endif}
end;
var
hoge: THoge;
proc: THogePrivateProc;
method: THogePrivateMethod;
begin
// You can either in here of the way,
proc := hoge.GetMethodAddr;
proc (hoge, 1, 2, 3);
// Even here of how good
TMethod (method) .Code := hoge.GetMethodAddr;
TMethod (method) .Data := hoge;
method (1, 2, 3) ;
end;
// Method 2
// To jump (here is simple if you just simply call)
procedure THogeHelper.CallMethod (Arg1, Arg2, Arg3 : Integer);
asm
JMP THoge.PrivateMethod
end;
unit UnitA;
type
THoge = class
private
FPrivateValue: Integer;
procedure PrivateMethod;
end;
end.
Ничего себе. Это действительно отстой. Я думаю, что в прошлом я использовал только крекеры класса, чтобы исправить или расширить сломанные или недостающие объекты RTL/VCL. Это никогда не бывает изящным делом, но в качестве временного решения, пока Emba не исправляет свою кодовую базу, они были весьма ценными. Кажется сумасшедшим, что они будут калечить функцию, которая поможет нам управлять их различными ненадежными библиотеками фреймов ... –
@Johan Это единственный вопрос, отмеченный 'delphi-10-berlin' - просто удалите его и дайте ему умереть. –
@Johan Вам нужно как минимум 5 баллов в мастер-теге, чтобы предложить синоним. Это первый вопрос для основного тега, поэтому никто не может делать синонимы. Лучше всего просто удалить неправильный тег и справиться с ним, если и когда он станет проблемой. Если никто не использует его, это не проблема. –