ASMを使用したコールオブジェクトメソッド
-
13-11-2019 - |
質問
私が達成しようとしていることをよりよく説明するために、私はうまくいくものから始めるつもりです。
他の手順を呼び出して文字列パラメータを渡す手続きを持っているとします。
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;
.
今私はと呼ぶことができますか... so(テスト済みと作品(:):
.
CallSaySomething(@SaySomething, 'Morning people!');
私の質問は、どのように私は類似の機能を達成することができますが、今回はのようなはメソッド:です。
.
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;
私はそれをかなり数ショットを与えましたが、私のアセンブリの知識は限られています。
解決
ASMを使用する理由は何ですか?
Objectsメソッドを呼び出してから、インスタンスポインタはメソッド呼び出しの最初のパラメータである必要があります。
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils;
type
TTest = class
procedure test(x : integer);
end;
procedure TTest.test(x: integer);
begin
writeln(x);
end;
procedure CallObjMethod(data, code : pointer; value : integer);
begin
asm
mov eax, data;
mov edx, value;
call code;
end;
end;
var t : TTest;
begin
t := TTest.Create();
try
CallObjMethod(t, @TTest.test, 2);
except
end;
readln;
end.
. 所属していません StackOverflow