2012-02-26 6 views
3

내가 성취하려는 것을 더 잘 설명하려면 먼저 작동하는 것으로부터 시작하겠습니다. 지금은 를 호출 할 수 있습니다ASM을 사용하는 객체 호출 방법

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

:이 우리가 호출 절차가

procedure CallSaySomething(AProc: Pointer; const AValue: string); 
var 
    LAddr: Integer; 
begin 
    LAddr := Integer(PChar(AValue)); 
    asm 
    MOV EAX, LAddr 
    CALL AProc; 
    end; 
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의 첫 번째 매개 변수해야 .com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/assemblersyntax_xml.html). 그런데 왜 귀찮은 지, 객체의 타입 TMyMethod = procedure (Const aValue : string)을 선언하고'CallMyObj'에서 포인터 타입을 대체하고'AObjectInstance'를 제거하십시오. 그러면 호출은'AObjMethod (AValue) :'처럼 간단해질 것입니다. –

+0

@LURD 이것은 내가 달성하고자하는 것을 설명하는 매우 단순한 방법입니다. 결국, 매개 변수와 매개 변수 유형이 알려지지 않은 메서드를 호출하려고합니다. 그 방법을 찾았습니다. . "TExec = Object of procedure;"를 사용합니다. 해킹과 "PUSH DWORD PTR AValue;"링크를 이용해 주셔서 감사합니다. – ComputerSaysNo

답변

4

asm을 사용하는 이유는 무엇입니까? //docs.embarcadero : 당신은 객체 메소드를 호출 할 때

, 다음 인스턴스 포인터는 메소드 호출

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

관련 문제