Yapmak istediğim, derleme kullanarak bir sınıf örneği oluşturmak, yöntemlerinden birini çağırmak ve sonra örneği boşaltmak.Delphi satır içi assembler'ı kullanarak sınıf örneği oluşturma
Çok önemli ve muhtemelen çok basit bir şeyi kaçırdığımı biliyorum, ama ne olduğunu bilmiyorum.
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TSomeClass = class(TObject)
private
FCreateDateTime: string;
public
constructor Create;
procedure SayYeah;
end;
constructor TSomeClass.Create;
begin
FCreateDateTime := DateTimeToStr(Now);
end;
procedure TSomeClass.SayYeah;
begin
Writeln('yeah @ ' + FCreateDateTime);
end;
procedure Doit;
asm
CALL TSomeClass.Create; // <= Access Violation
CALL TSomeClass.SayYeah;
CALL TSomeClass.Free;
end;
begin
try
Doit;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
Bilginize: Ben bunu yapmanın başka bir yolu, düşük seviyede bunu başarmak nasıl anlamak istiyorum.
GÜNCELLEME: ziyade PUSH daha Ebx kullanılarak kusur bulmak için Arnaud için
Teşekkür:
Update2: Andreas Rejbrand için
sayesinde, suçlu bulmak başardınız/POP EAX
var
TSomeClass_TypeInfo: Pointer;
procedure Doit;
asm
MOV DL, $01;
MOV EAX, TSomeClass_TypeInfo;
CALL TSomeClass.Create;
PUSH EAX;
CALL TSomeClass.SayYeah; // call method
POP EAX;
MOV DL, $01;
CALL TSomeClass.Free; // pointer to instance(Self) is expected in EAX
end;
begin
TSomeClass_TypeInfo := TSomeClass;
try
Doit;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
EBX'in kaydedilmesi gerekiyor - Arnaud'un cevabına bir göz atmalısın – PhiS
@PhiS evet Efendim, Arnaud'un cevabını okudum, kiminle ilgileniyorsa, tüm cevapları okuyacak (sadece 2) ve yorumlar (: – ComputerSaysNo
EBX'i kaydetmeden kullandığınız soruyu güncellemenizde, lütfen bunu düzeltin (örn. ebx/pop ebx komutunu kullanın), eğer böyle bir işlevi kullanan gerçek bir programın çökmesine neden olmuyorsanız - ve bunun nedeni bulmak çok zor olurdu ... – PhiS