Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
unit System;
 
interface
 
{$IF defined(CPUX86) and defined(ASSEMBLER)}
  {$DEFINE X86ASMRTL}
{$ELSE}
  {$DEFINE PUREPASCAL}
{$ENDIF}
 
const
  S_OK = 0;
  S_FALSE = $00000001;
 
  vtInteger       = 0;
  vtBoolean       = 1;
  vtChar          = 2;
  vtExtended      = 3;
  vtString        = 4;
  vtPointer       = 5;
  vtPChar         = 6;
  vtObject        = 7;
  vtClass         = 8;
  vtWideChar      = 9;
  vtPWideChar     = 10;
  vtAnsiString    = 11;
  vtCurrency      = 12;
  vtVariant       = 13;
  vtInterface     = 14;
  vtWideString    = 15;
  vtInt64         = 16;
  vtUnicodeString = 17;
 
type
  THandle = NativeUInt;
  HRESULT = type Longint;
  HINST   = THandle;
  HMODULE = HINST;
  PByte   = ^Byte;
 
  TDateTime = type Double;
  PExtended = ^Extended;
  PShortString = ^ShortString;
  PCurrency = ^Currency;
  PVariant = ^Variant;
  PInt64 = ^Int64;
 
  PVarRec = ^TVarRec;
  TVarRec = record
    case Integer of
      0: (case Byte of
            vtInteger:       (VInteger: Integer);
            vtBoolean:       (VBoolean: Boolean);
            vtChar:          (VChar: AnsiChar);
            vtExtended:      (VExtended: PExtended);
            vtString:        (VString: PShortString);
            vtPointer:       (VPointer: Pointer);
            vtPChar:         (VPChar: PAnsiChar);
            vtObject:        (VObject: Pointer);
            vtClass:         (VClass: Pointer);
            vtWideChar:      (VWideChar: WideChar);
            vtPWideChar:     (VPWideChar: PWideChar);
            vtAnsiString:    (VAnsiString: Pointer);
            vtCurrency:      (VCurrency: PCurrency);
            vtVariant:       (VVariant: PVariant);
            vtInterface:     (VInterface: Pointer);
            vtWideString:    (VWideString: Pointer);
            vtInt64:         (VInt64: PInt64);
            vtUnicodeString: (VUnicodeString: Pointer);
         );
      1: (_Reserved1: NativeInt;
          VType:      Byte;
         );
  end;
 
  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;
 
  TTypeKind = (tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat,
    tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString,
    tkVariant, tkArray, tkRecord, tkInterface, tkInt64, tkDynArray, tkUString,
    tkClassRef, tkPointer, tkProcedure);
 
var ExitCode: Integer = 0;
 
procedure _Halt0;
procedure _HandleFinally;
function _IntfClear(var Dest: IInterface): Pointer;
{$IF not defined(X86ASMRTL)}
function _FinalizeArray(P: Pointer; TypeInfo: Pointer; ElemCount: NativeUInt): Pointer;
{$ELSE}
procedure _FinalizeArray(P: Pointer; TypeInfo: Pointer; ElemCount: NativeUInt);
{$ENDIF}
{$IF defined(CPUX64)}
function _DelphiExceptionHandler(ExceptionRecord: Pointer; EstablisherFrame: NativeUInt; ContextRecord: Pointer; DispatcherContext: Pointer): LongInt; stdcall;
procedure _UnhandledException;
procedure _DestroyException(ExceptionPointers: Pointer; EstablisherFrame: NativeUInt);
{$ENDIF}
 
implementation
 
type
  PPTypeInfo = ^PTypeInfo;
  PTypeInfo = ^TTypeInfo;
  TTypeInfo = packed record
    Kind: TTypeKind;
    Name: ShortString;
  end;
 
  TFieldInfo = packed record
    TypeInfo: PPTypeInfo;
    case Integer of
    0: ( Offset: Cardinal );
    1: ( _Dummy: NativeUInt );
  end;
 
  PFieldTable = ^TFieldTable;
  TFieldTable = packed record
    X: Word;
    Size: Cardinal;
    Count: Cardinal;
    Fields: array [0..0] of TFieldInfo;
  end;
 
procedure ExitProcess(ExitCode: LongWord); stdcall; external 'kernel32.dll' name 'ExitProcess';
 
procedure _Halt0;
begin
  ExitProcess(ExitCode);
end;
 
procedure _HandleFinally;
asm
end;
 
function _IntfClear(var Dest: IInterface): Pointer;
{$IFDEF PUREPASCAL}
var
  P: Pointer;
begin
  Result := @Dest;
  if Dest <> nil then
  begin
    P := Pointer(Dest);
    Pointer(Dest) := nil;
    IInterface(P)._Release;
  end;
end;
{$ELSE !PUREPASCAL}
{$IFDEF CPUX86}
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;
{$ENDIF CPUX86}
{$ENDIF !PUREPASCAL}
 
{$IF not defined(X86ASMRTL)}
function _FinalizeArray(P: Pointer; TypeInfo: Pointer; ElemCount: NativeUInt): Pointer;
begin
  Result := P;
  if ElemCount = 0 then Exit;
  case PTypeInfo(TypeInfo).Kind of
    tkInterface:
      while ElemCount > 0 do
      begin
        _IntfClear(IInterface(P^));
        Inc(PByte(P), SizeOf(Pointer));
        Dec(ElemCount);
      end;
  end;
end;
{$ELSE X86ASMRTL}
procedure _FinalizeArray(P: Pointer; TypeInfo: Pointer; ElemCount: NativeUInt);
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;
{$ENDIF X86ASMRTL}
 
{$IF defined(CPUX64)}
function _DelphiExceptionHandler(ExceptionRecord: Pointer; EstablisherFrame: NativeUInt; ContextRecord: Pointer; DispatcherContext: Pointer): LongInt; stdcall;
begin
  Result := 0;
end;
 
procedure _UnhandledException;
begin
end;
 
procedure _DestroyException(ExceptionPointers: Pointer; EstablisherFrame: NativeUInt);
begin
end;
{$ENDIF}
 
end.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 16:23 06-02-2016 | Исправлено: AlexCoRu, 16:57 06-02-2016
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru