{*****************************************************************************} { } { Tnt Delphi Unicode Controls } { http://tnt.ccci.org/delphi_unicode_controls/ } { Version: 2.1.11 } { } { Copyright (c) 2002-2004, Troy Wolbrink (troy.wolbrink@ccci.org) } { } {*****************************************************************************} unit TntTypInfo; {$INCLUDE TntCompilers.inc} interface uses TypInfo; {$IFNDEF COMPILER_6_UP} // Delphi 5 compatibility function GetWideStrProp(Instance: TObject; PropInfo: PPropInfo): WideString; procedure SetWideStrProp(Instance: TObject; PropInfo: PPropInfo; const Value: WideString); {$ENDIF} implementation {$IFNDEF COMPILER_6_UP} procedure AssignWideStr(var Dest: WideString; const Source: WideString); begin Dest := Source; end; procedure IntGetWideStrProp(Instance: TObject; PropInfo: PPropInfo; var Value: WideString); assembler; asm { -> EAX Pointer to instance } { EDX Pointer to property info } { ECX Pointer to result string } PUSH ESI PUSH EDI MOV EDI,EDX MOV EDX,[EDI].TPropInfo.Index { pass index in EDX } CMP EDX,$80000000 JNE @@hasIndex MOV EDX,ECX { pass value in EDX } @@hasIndex: MOV ESI,[EDI].TPropInfo.GetProc CMP [EDI].TPropInfo.GetProc.Byte[3],$FE JA @@isField JB @@isStaticMethod @@isVirtualMethod: MOVSX ESI,SI { sign extend slot offset } ADD ESI,[EAX] { vmt + slot offset } CALL DWORD PTR [ESI] JMP @@exit @@isStaticMethod: CALL ESI JMP @@exit @@isField: AND ESI,$00FFFFFF MOV EDX,[EAX+ESI] MOV EAX,ECX CALL AssignWideStr @@exit: POP EDI POP ESI end; function GetWideStrProp(Instance: TObject; PropInfo: PPropInfo): WideString; begin IntGetWideStrProp(Instance, PropInfo, Result); end; procedure SetWideStrProp(Instance: TObject; PropInfo: PPropInfo; const Value: WideString); assembler; asm { -> EAX Pointer to instance } { EDX Pointer to property info } { ECX Pointer to string value } PUSH ESI PUSH EDI MOV ESI,EDX MOV EDX,[ESI].TPropInfo.Index { pass index in EDX } CMP EDX,$80000000 JNE @@hasIndex MOV EDX,ECX { pass value in EDX } @@hasIndex: MOV EDI,[ESI].TPropInfo.SetProc CMP [ESI].TPropInfo.SetProc.Byte[3],$FE JA @@isField JB @@isStaticMethod @@isVirtualMethod: MOVSX EDI,DI ADD EDI,[EAX] CALL DWORD PTR [EDI] JMP @@exit @@isStaticMethod: CALL EDI JMP @@exit @@isField: AND EDI,$00FFFFFF ADD EAX,EDI MOV EDX,ECX CALL AssignWideStr @@exit: POP EDI POP ESI end; {$ENDIF} end.