質問

私が達成しようとしていることをよりよく説明するために、私はうまくいくものから始めるつもりです。

他の手順を呼び出して文字列パラメータを渡す手続きを持っているとします。

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.
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top