내가 성취하려는 것을 더 잘 설명하려면 먼저 작동하는 것으로부터 시작하겠습니다. 지금은 를 호출 할 수 있습니다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;
나는 꽤 많은 샷을 주었지만, 내 어셈블리 지식은 제한적이다.
당신은 아마이 [assemblersyntax 문서]를 읽고 당신의 방법을 찾을 수 있습니다 (HTTP의 첫 번째 매개 변수해야 .com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/assemblersyntax_xml.html). 그런데 왜 귀찮은 지, 객체의 타입 TMyMethod = procedure (Const aValue : string)을 선언하고'CallMyObj'에서 포인터 타입을 대체하고'AObjectInstance'를 제거하십시오. 그러면 호출은'AObjMethod (AValue) :'처럼 간단해질 것입니다. –
@LURD 이것은 내가 달성하고자하는 것을 설명하는 매우 단순한 방법입니다. 결국, 매개 변수와 매개 변수 유형이 알려지지 않은 메서드를 호출하려고합니다. 그 방법을 찾았습니다. . "TExec = Object of procedure;"를 사용합니다. 해킹과 "PUSH DWORD PTR AValue;"링크를 이용해 주셔서 감사합니다. – ComputerSaysNo