Hab gerade selber etwas in der Delphipraxis zu einem ganz anderen Thema etwas gefunden. Bin mal so frei und kopier das einfach so raus:
Delphi-Quellcode:
function IsObject(AObject: Pointer): Boolean;
asm
OR EAX,EAX
// AObject == nil ??
JNZ @@1
RET
@@1:
XOR EDX,EDX
// install Exception Frame, SEH
PUSH OFFSET @@3
PUSH DWord Ptr FS:[EDX]
MOV FS:[EDX],ESP
MOV EAX,[EAX]
// EAX := AObject^.ClassType
OR EAX,EAX
// ClassType == nil ??
JZ @@2
CMP EAX,[EAX].vmtSelfPtr
// EAX = ClassType.vmtSelfPtr
SETZ AL
@@2: POP DWord Ptr FS:[EDX]
POP EDX
RET
// Exception Handler, wird aufgerufen wenn zwischen @@1 und @@2 eine AV auftritt,
// zum Debugger muß auf @@3 ein Breakpoint gesetzt werden,
// Dieser SEH ist NICHT sichtbar für Delphi's Debugger !!
@@3: MOV EAX,[ESP + 00Ch]
// context
MOV DWord Ptr [EAX + 0B0h],0
// context.eax = 0
MOV DWord Ptr [EAX + 0B8h],OFFSET @@2
// context.eip = @@2
SUB EAX,EAX
// 0 = ExceptionContinueExecution
end;
Also mit
ASM scheints ja möglich zu sein. Werde mal versuchen, ob man sowas komfortabel und sauber kapseln kann. Wenn ja, lad ich den entsprechenden Code hoch.
Grüße
Daniel