Чтобы лучше объяснить то, что я пытаюсь выполнить, я начну с того, что работает.Метод вызова объекта с использованием ASM
Скажем, у нас есть процедура, которая может вызывать другую процедуру и передать строковый параметр к нему:
procedure CallSaySomething(AProc: Pointer; const AValue: string);
var
LAddr: Integer;
begin
LAddr := Integer(PChar(AValue));
asm
MOV EAX, LAddr
CALL AProc;
end;
end;
Это процедура, которую мы будем называть:
procedure SaySomething(const AValue: string);
begin
ShowMessage(AValue);
end;
Теперь я могу назвать SaySomething, как и все (испытания и работы (:):
CallSaySomething(@SaySomething, 'Morning people!');
Мой вопрос, как я могу добиться подобного результата, но на этот раз SaySomething должен быть метод:
type
TMyObj = class
public
procedure SaySomething(const AValue: string); // calls show message by passing AValue
end;
так, если вы все еще со мной ... моя цель состоит в том, чтобы получить к процедуре, аналогичной:
procedure CallMyObj(AObjInstance, AObjMethod: Pointer; const AValue: string);
begin
asm
// here is where I need help...
end;
end;
Я дал довольно много снимков, но моя сборка знание ограничено.
Вы, вероятно, можете найти свой путь, прочитав это [assemblersyntax документа] (HTTP: //docs.embarcadero .com/продукты/rad_studio/delphiAndcpp2009/HelpUpdate2/RU/HTML/devcommon/assemblersyntax_xml.html). Но зачем беспокоиться, объявляйте 'тип TMyMethod = procedure (Const aValue: string) Object;' и замените тип указателя в 'CallMyObj' и удалите' AObjectInstance'. Тогда ваш вызов будет таким же простым, как 'AObjMethod (AValue):'. –
@LURD это очень упрощенный способ описания того, чего я пытаюсь достичь, в конце концов, я собираюсь вызывать методы с неизвестным количеством параметров и типа параметров, я нашел способ вокруг него. используя «TExec = процедура объекта»; взломать и «PUSH DWORD PTR AValue», спасибо за ссылку – ComputerSaysNo