Var Type const Variant var Empty var Null































- Slides: 31




“Маски” Var. Type const { Variant var. Empty = var. Null = var. Smallint = var. Integer = var. Single = var. Double = var. Currency = var. Date = var. Ole. Str = var. Dispatch = var. Error = var. Boolean = var. Variant = var. Unknown = var. Byte = var. Str. Arg = var. String = var. Any = var. Type. Mask = var. Array = var. By. Ref = type codes (wtypes. h) } $0000; { vt_empty } $0001; { vt_null } $0002; { vt_i 2 } $0003; { vt_i 4 } $0004; { vt_r 4 } $0005; { vt_r 8 } $0006; { vt_cy } $0007; { vt_date } $0008; { vt_bstr } $0009; { vt_dispatch } $000 A; { vt_error } $000 B; { vt_bool } $000 C; { vt_variant } $000 D; { vt_unknown } $0011; { vt_ui 1 } $0048; { vt_clsid } $0100; { Pascal string; not OLE compatible } $0101; $0 FFF; $2000; $4000; Маршалінг. Динамічні виклики 4




Маршалінг з використанням типу Ole. Variant. Фрагмент (основного) модуля Unit 1 серверної програми uses Variants; procedure Get. Data (var V: Ole. Variant); ; var s: string; s 1: Wide. String; l, r : integer; . . . { V: =Var. Array. Of([’рядок 1', 1. 5 e-5]); } l: =0; r: =2; V: =Var. Array. Create([l, r], var. Variant); s: = 'string'; V[0]: =s; // string //Show. Message(Word. To. Hex(Var. Type(V[0]))) // 0008 V[1]: =2. 5 e-5; s 1: = 'wide string'; V[2]: =s 1; // Wide. String Маршалінг. Динамічні виклики 8

Маршалінг з використанням типу Ole. Variant. Модуль автоматизації (Unit 2) серверної програми unit Unit 2; interface uses Com. Obj, SMarsh_TLB, Std. Vcl; type TMarsh = class(TAuto. Object, IMarsh) protected procedure Get. Data(out v: Ole. Variant); safecall; end; implementation uses Com. Serv, Unit 1; procedure TMarsh. Get. Data(out v: Ole. Variant); begin Unit 1. Get. Data(v); end; Маршалінг. Динамічні виклики 9

Маршалінг з типом Ole. Variant. Клієнтська програма (CMarsh). Фрагмент основного модуля Unit 1 Cl var Serv: variant; V: Ole. Variant; . . . Serv: =Create. Ole. Object('SMarsh'); . . . CMarsh Serv. Get. Data(V); for i: = Var. Array. Low. Bound(V, 1) to Var. Array. High. Bound(V, 1) do case Var. Type(V[i]) of 8 (* var. Ole. Str *): . . . Word. To. Hex(Var. Type(V[i]))+ V[i]. . . 5 (* var. Double *): . . . Float. To. Str(V[i]). . . end Маршалінг. Динамічні виклики 10




Маршалінг з використанням бібліотеки типу. Файл імпорту Marsh. Rec_TLB. pas (фрагмент) // Declaration of structures, unions and aliases. Record 1 = packed record Field 1: Integer; Field 2: Wide. String; end; IRec. Intf = interface(IDispatch) ['{AD 714889 -02 BD-4 DCF-8 B 94 -CAD 391444825}'] procedure Method 1(var p: Record 1); safecall; end; Маршалінг. Динамічні виклики 14

Маршалінг з використанням бібліотеки типу. Сервер Marsh. Rec. Модуль автоматизації Unit 2 unit Unit 2; interface uses Com. Obj, Marsh. Rec_TLB; type TRec. Intf = class(TAuto. Object, IRec. Intf) protected procedure Method 1(var p: Record 1); safecall; end; implementation uses Com. Serv; procedure TRec. Intf. Method 1(var p: Record 1); begin p. Field 1: = p. Field 1+1; p. Field 2 : = p. Field 2+' * ' + p. Field 2 end; Маршалінг. Динамічні виклики 15

Маршалінг з використанням бібліотеки типу. Клієнт Rec_client. Фрагмент основного модуля Unit 1 uses Com. Obj, Marsh. Rec_TLB; var V: variant; intrf: IRec. Intf; V: = Create. Ole. Object('Marsh. Rec. Intf'); intrf: =Create. Ole. Object('Marsh. Rec. Intf') as IRec. Intf; procedure TForm 1. Button 1 Click(Sender: TObject); var r: Record 1; begin r. Field 1: =strtoint(edit 1. Text); r. Field 2: =edit 2. Text; //NO! V. Method 1(r); //обмеження на параметри Invoke! intrf. Method 1(r); Label 1. Caption: =inttostr(r. Field 1); Label 2. Caption: =(r. Field 2); Rec_client end; Маршалінг. Динамічні виклики 16

Динамічні виклики та інтерфейс IDispatch. Інтерфейс IArithm // фрагмент з ar_s_TLB. pas (файл імпорту бібліотеки типів) IArithm = interface(IDispatch) ['{DD 680709 -E 06 D-469 C-B 949 -8 BE 873 C 7 EE 03}'] function a(P 1: Integer; P 2: Integer): Integer; safecall; function s(P 1: Integer; P 2: Integer): Integer; safecall; end; // фрагмент з модуля автоматизації unit 2. pas function TArithm. s(P 1, P 2: Integer): Integer; begin result: =Unit 1. s(P 1, P 2) end; // фрагмент з unit 1. pas function s(p 1, p 2: Integer) : integer; begin Form 1. Label 1. Caption: = Inttostr(p 1); Form 1. Label 2. Caption: = Inttostr(p 2); result: = p 1 -p 2 end; Маршалінг. Динамічні виклики 17


Get. IDs. Of. Names var IDis: IDispatch; WMethod. Name: Wide. String; PMethod. Name: PWide. Char; var. GUID: TGUID; Disp. ID: Integer; IDis : = Create. Ole. Object('ar_s. arithm') as IDispatch; WMethod. Name : = 'a'; PMethod. Name : = PWide. Char(WMethod. Name); OLECHECK(IDis. Get. IDs. Of. Names( var. GUID, // const IID: TGUID; no used !!! @PMethod. Name, // Names: Pointer; 1, // Name. Count: Integer; 0, // Locale. ID: Integer; @Disp. ID //Disp. IDs: Pointer )); Маршалінг. Динамічні виклики 19


Invoke tag. DISPPARAMS = record rgvarg: PVariant. Arg. List; rgdispid. Named. Args: PDisp. IDList; c. Args: Longint; c. Named. Args: Longint; end; TDisp. Params = tag. DISPPARAMS; var Excep. Info: TExcep. Info; Arg. Err: Integer; Ole. Args: array of Ole. Variant; Disp. Params: TDisp. Params; var. GUID: TGUID; reslt: variant; Label 1. Caption: = reslt; Ole. Args: =Var. Array. Create([0, 1], var. Variant); Ole. Args[0]: =strtoint(edit 1. Text); Ole. Args[1]: =strtoint(edit 2. Text); Fill. Char(Disp. Params, Size. Of(Disp. Params), 0); Disp. Params. rgvarg : = @Ole. Args[0]; // PVariant. Arg. List Disp. Params. c. Args : = 2; // integer Disp. Params. rgdispid. Named. Args : = nil; Disp. Params. c. Named. Args : = 0; // integer IDis. Invoke( Disp. ID, // Disp. ID: Integer; GUID_NULL, // const IID: TGUID; 0, // Locale. ID: Integer; DISPATCH_METHOD {=1}, // Flags: Word; Disp. Params, // var Params; @reslt, // Var. Result: Pointer @Excep. Info, // Excep. Info: Pointer @Arg. Err); // Arg. Err: Pointer Маршалінг. Динамічні виклики 21





Invoke disp. Id. Member Identifies the member. Use Get. IDs. Of. Names or the object's documentation to obtain the dispatch identifier. riid Reserved for future use. Must be IID_NULL. lcid The locale context in which to interpret arguments. The lcid is used by the Get. IDs. Of. Names function, and is also passed to IDispatch: : Invoke to allow the object to interpret its arguments specific to a locale. Applications that do not support multiple national languages can ignore this parameter. Маршалінг. Динамічні виклики 26


Invoke p. Disp. Params Pointer to a DISPPARAMS structure containing an array of arguments, an array of argument DISPIDs for named arguments, and counts for the number of elements in the arrays. p. Var. Result Pointer to the location where the result is to be stored, or NULL if the caller expects no result. This argument is ignored if DISPATCH_PROPERTYPUT or DISPATCH_PROPERTYPUTREF is specified. p. Excep. Info Pointer to a structure that contains exception information. This structure should be filled in if DISP_E_EXCEPTION is returned. Can be NULL. pu. Arg. Err The index within rgvarg of the first argument that has an error. Arguments are stored in p. Disp. Params->rgvarg in reverse order, so the first argument is the one with the highest index in the array. This parameter is returned only when the resulting return value is DISP_E_TYPEMISMATCH or DISP_E_PARAMNOTFOUND. This argument can be set to null. Маршалінг. Динамічні виклики 28

Locale ID (LCID) Chart p. Disp. Params Pointer to a DISPPARAMS structure containing an array of arguments, an array of argument DISPIDs for named arguments, and counts for the number of elements in the arrays. Маршалінг. Динамічні виклики 29


Char char slide
Ontinue
Char *name
V char
Forward reference table (frt) is arranged like ?
Null type and deflection type instruments
Is it possible to create an object of an empty class type
Null type instruments
Nihad004
Constant int arduino
Const int size =18 string *tbl2
Const byte
Constants c#
Vba private const
Static variable
Void encode_char(const char character, bool bits[8])
Const double c
Contoh varian adalah dan contoh invariant adalah
Intrepration
Nrxn duplication
Snp variant
8086 biu
Variant analysis
Loop variant vs invariant
Rare variant
A regional variation of a language
#**# merupakan karakter yang terdapat pada type data
Snp variant
Fvs variant map
Compile time polymorphism in c++
Atherosclerosis plaque development
Hugo krawczyk