Этот компонент является пробным и показывает сообщение при первом запусках. Обычное окно showmessage () (от fmx.dialogs). < /P>
Я решил скрыть это сообщение в тестовых целях, поэтому сначала попытался выполнить работу с компонентом в другом потоке, где Showmessage ( ) не может быть показан (потому что это не основной поток). Как и ожидалось, компонент отказался работать из -за исключения. < /P>
Поэтому я решил сделать инъекцию памяти. Это сработало (в Linux). Но теперь у меня есть вопрос, который я пишу ниже код. < /P>
Код: Выделить всё
type
size_t = NativeUInt;
var
asm_cmd: Integer;
flag_NeedRemove_RET: Boolean;
const
PROT_READ = 1;
PROT_WRITE = 2;
PROT_EXEC = 4;
function mprotect(Addr: Pointer; Len: size_t; Prot: Integer): Integer; cdecl external 'libc.so' name 'mprotect';
function getpagesize: Integer; external 'libc.so' name 'getpagesize';
implementation
uses
Posix.Base;
...
function InjectCode(PDest: Pointer; PSrc: Pointer; Size: Integer): Boolean;
var
SysPageSize, PageSize, AlignedAddr: Integer;
begin
Result := False;
SysPageSize := getpagesize;
AlignedAddr := (Integer(PDest) - 1) and not (SysPageSize - 1);
PageSize := SysPageSize;
while Integer(PDest) - 1 + Size >= AlignedAddr + PageSize do
Inc(PageSize, SysPageSize);
if mprotect(Pointer(AlignedAddr), PageSize, PROT_READ or PROT_WRITE or PROT_EXEC) = 0 then
try
Move(PSrc^, PDest^, Size);
if mprotect(Pointer(AlignedAddr), PageSize, PROT_READ or PROT_EXEC) = 0 then
Result := True;
except
end;
end;
...
procedure TForm.btComponentRunClick(Sender: TObject);
begin
Component.Run; // Here is a component call with hidden ShowMessage inside
// Restoring original ShowMessage
if flag_NeedRemove_RET then
begin
asm_cmd := $55;
if not InjectCode(Addr(ShowMessage), Addr(asm_cmd), 1) then
raise Exception.Create('Error code injection');
flag_NeedRemove_RET := False;
end;
end;
initialization
// Setting force exit at start of ShowMessage
asm_cmd := $C3;
if not InjectCode(Addr(ShowMessage), Addr(asm_cmd), 1) then
raise Exception.Create('Error code injection');
flag_NeedRemove_RET := True;
и вопрос №2 (меньше): нарушать ли я любое из пользовательских соглашений этим действием, если я не сделаю это В тестовых целях? Я не изменяю код компонента ... все, что я делаю, это изменение кода функций Embarcadero в памяти.
Подробнее здесь: https://stackoverflow.com/questions/794 ... e-function
Мобильная версия