2012-02-26 2 views
3

Чтобы лучше объяснить то, что я пытаюсь выполнить, я начну с того, что работает.Метод вызова объекта с использованием 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; 

Я дал довольно много снимков, но моя сборка знание ограничено.

+0

Вы, вероятно, можете найти свой путь, прочитав это [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):'. –

+0

@LURD это очень упрощенный способ описания того, чего я пытаюсь достичь, в конце концов, я собираюсь вызывать методы с неизвестным количеством параметров и типа параметров, я нашел способ вокруг него. используя «TExec = процедура объекта»; взломать и «PUSH DWORD PTR AValue», спасибо за ссылку – ComputerSaysNo

ответ

4

В чем причина использования asm?

когда вы вызываете метод объектов, то указатель экземпляра должен быть первым параметром в вызове метода

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

благодарю вас за код, я нашел один способ до сих пор, ваш путь тоже хорош, причина использования ASM заключается в том, что «образец» кода Я опубликовал минималистично, в конце концов, я собираюсь передать неизвестное количество параметров и тип параметра. – ComputerSaysNo

+0

в методе RTTI 'invoke()' пропускает неизвестное количество параметров с неизвестным типом, используя 'array of TValue'. – teran

+0

Да, но я хочу избежать использования RTTI, я хочу использовать RTTI для захвата информации (при запуске), а затем использовать ASM для вызова методов. – ComputerSaysNo