AlexCoRu
BANNED | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору unit System; interface const S_OK = 0; S_FALSE = $00000001; type THandle = LongWord; HRESULT = type Longint; PByte = ^Byte; HINST = THandle; HMODULE = HINST; TGUID = record D1: Cardinal; D2: Word; D3: Word; D4: array [0..7] of Byte; end; IInterface = interface ['{00000000-0000-0000-C000-000000000046}'] function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end; IUnknown = IInterface; var ExitCode: Integer = 0; procedure _Halt0; procedure _HandleFinally; function _IntfClear(var Dest: IInterface): Pointer; procedure _FinalizeArray(p: Pointer; typeInfo: Pointer; elemCount: Cardinal); implementation const tkLString = 10; tkWString = 11; tkVariant = 12; tkArray = 13; tkRecord = 14; tkInterface = 15; tkDynArray = 17; procedure ExitProcess(ExitCode: Integer); stdcall; external 'kernel32.dll' name 'ExitProcess'; procedure _Halt0; begin ExitProcess(ExitCode); end; procedure _HandleFinally; asm end; function _IntfClear(var Dest: IInterface): Pointer; asm MOV EDX,[EAX] TEST EDX,EDX JE @@1 MOV DWORD PTR [EAX],0 PUSH EAX PUSH EDX MOV EAX,[EDX] CALL DWORD PTR [EAX] + VMTOFFSET IInterface._Release POP EAX @@1: end; procedure _FinalizeArray(p: Pointer; typeInfo: Pointer; elemCount: Cardinal); asm CMP ECX,0 JE @@zerolength PUSH EAX PUSH EBX PUSH ESI PUSH EDI MOV EBX,EAX MOV ESI,EDX MOV EDI,ECX XOR EDX,EDX MOV AL,[ESI] MOV DL,[ESI+1] CMP AL,tkInterface JE @@Interface JMP @@exit @@Interface: MOV EAX,EBX ADD EBX,4 CALL _IntfClear DEC EDI JG @@Interface @@exit: POP EDI POP ESI POP EBX POP EAX @@zerolength: end; end. | Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 16:23 06-02-2016 | Исправлено: AlexCoRu, 16:57 06-02-2016 |
|