Question

To better explain what I'm trying to accomplish, I'm going to start with something that works.

Say we have a procedure that can call another procedure and pass a string parameter to it:

procedure CallSaySomething(AProc: Pointer; const AValue: string);
var
  LAddr: Integer;
begin
  LAddr := Integer(PChar(AValue));
  asm
    MOV EAX, LAddr
    CALL AProc;
  end;
end;

This is the procedure that we will call:

procedure SaySomething(const AValue: string);
begin
  ShowMessage( AValue );
end;

Now I can call SaySomething like so(tested and works (: ):

CallSaySomething(@SaySomething, 'Morning people!');

My question is, how can I achieve similar functionality, but this time SaySomething should be a method:

type
  TMyObj = class
  public
    procedure SaySomething(const AValue: string); // calls show message by passing AValue
  end;

so, if you're still with me..., my goal is to get to a procedure similar to:

procedure CallMyObj(AObjInstance, AObjMethod: Pointer; const AValue: string);
begin
  asm
    // here is where I need help...
  end;
end;

I've gave it quite a few shots, but my assembly knowledge is limited.

Was it helpful?

Solution

what is the reason to use asm?

when you are calling objects method, then instance pointer have to be the first parameter in method call

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.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top