亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? objautox.pas

?? 在delphi下實現類似于java, C#等反射調用的一個例子
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
    Result := cvt
  else
    Result := Codes[Source][Dest];
end;

function InterfaceDerivesFrom(TypeData: PTypeData; const GUID: TGUID): boolean;
begin
  Result := True;
  while TypeData <> nil do
  begin
    if IsEqualGUID(TypeData^.Guid, GUID) then
      Exit;
    if (TypeData^.IntfParent <> nil) and (TypeData^.IntfParent^ <> nil) then
      TypeData := GetTypeData(TypeData^.IntfParent^)
    else
      Break;
  end;
  Result := False;
end;

function GetVariantType(TypeInfo: PTypeInfo): TVarType;
var
  TypeData: PTypeData;
begin
  case TypeInfo^.Kind of
    tkUnknown: Result := varError;

    tkInteger, tkChar, tkEnumeration, tkWChar:
      if (TypeInfo = System.TypeInfo(boolean)) or (TypeInfo =
        System.TypeInfo(wordbool)) or (TypeInfo = System.TypeInfo(longbool)) then
        Result := varBoolean
      else
      begin
        TypeData := GetTypeData(TypeInfo);
        if TypeData^.MinValue >= 0 then
          if cardinal(TypeData^.MaxValue) > $FFFF then
            Result := varLongWord
          else if TypeData^.MaxValue > $FF then
            Result := varWord
          else
            Result := varByte
        else
        if (TypeData^.MaxValue > $7FFF) or (TypeData^.MinValue < -$7FFF - 1) then
          Result := varInteger
        else if (TypeData^.MaxValue > $7F) or (TypeData^.MinValue < -$7F - 1) then
          Result := varSmallint
        else
          Result := varShortint;
      end;
    tkFloat:
    begin
      TypeData := GetTypeData(TypeInfo);
      case TypeData^.FloatType of
        ftSingle: Result := varSingle;
        ftDouble:
          if TypeInfo = System.TypeInfo(TDateTime) then
            Result := varDate
          else
            Result := varDouble;
        ftComp, ftCurr: Result := varCurrency;
        else
          Result := varError;
      end;
    end;
    tkString: Result  := varString;
    tkLString: Result := varString;
  {$IFDEF DELPHI2009}
    tkUString: Result := varUString;
  {$ENDIF}
    tkWString: Result := varOleStr;
    tkInterface:
    begin
      TypeData := GetTypeData(TypeInfo);
      if InterfaceDerivesFrom(TypeData, IDispatch) then
        Result := varDispatch
      else
        Result := varUnknown;
    end;
    tkVariant: Result := varVariant;
    tkInt64:
  {$IFDEF DELPHI2009}
    begin
      TypeData := GetTypeData(TypeInfo);
      if TypeData^.MinInt64Value >= 0 then
        Result := varUInt64
      else
        Result := varInt64;
    end;
  {$ELSE}
		Result   := varInt64;
	{$ENDIF}

    tkClass: Result := varInteger;

    else
      Result := varError;
  end;
end;

procedure GetFloatReturn(var Ret; FloatType: TFloatType);
asm
  CMP     EDX, ftSingle
  JE      @@single
  CMP     EDX, ftDouble
  JE      @@double
  CMP     EDX, ftExtended
  JE      @@extended
  CMP     EDX, ftCurr
  JE      @@Curr
  CMP     EDX, ftComp
  JE      @@Curr    // Same as Curr
  // should never get here
  @@single:
  FSTP      DWORD PTR [EAX]
  WAIT
  RET
  @@double:
  FSTP      QWORD PTR [EAX]
  WAIT
  RET
  @@extended:
  FSTP      TBYTE PTR [EAX]
  WAIT
  RET
  @@Curr:
  FISTP     QWORD PTR [EAX]
  WAIT
end;

function GetMethods(ClassType: TClass): TMethodInfoArray;
var
  VMT:        Pointer;
  MethodInfo: Pointer;
  Count:      integer;
  I:          integer;
begin
  Count := 0;
  VMT   := ClassType;
  repeat
    MethodInfo := PPointer(integer(VMT) + vmtMethodTable)^;
    if MethodInfo <> nil then
      Inc(Count, PWord(MethodInfo)^);
    // Find the parent VMT
    VMT := PPointer(integer(VMT) + vmtParent)^;
    if VMT = nil then
      Break;
    VMT := PPointer(VMT)^;
  until False;
  SetLength(Result, Count);
  I   := 0;
  VMT := ClassType;
  repeat
    MethodInfo := PPointer(integer(VMT) + vmtMethodTable)^;
    if MethodInfo <> nil then
    begin
      Count := PWord(MethodInfo)^;
      Inc(integer(MethodInfo), SizeOf(word));
      while Count > 0 do
      begin
        Result[I] := MethodInfo;
        Inc(I);
        Inc(integer(MethodInfo), PMethodInfoHeader(MethodInfo)^.Len);
        Dec(Count);
      end;
    end;
    // Find the parent VMT
    VMT := PPointer(integer(VMT) + vmtParent)^;
    if VMT = nil then
      Exit;
    VMT := PPointer(VMT)^;
  until False;
end;

function GetMethodInfo(Instance: TObject;
  const MethodName: ShortString): PMethodInfoHeader;
var
  VMT:        Pointer;
  MethodInfo: Pointer;
  Count:      integer;
begin
  // Find the method
  VMT := PPointer(Instance)^;
  repeat
    MethodInfo := PPointer(integer(VMT) + vmtMethodTable)^;
    if MethodInfo <> nil then
    begin
      // Scan method table for the method
      Count := PWord(MethodInfo)^;
      Inc(integer(MethodInfo), 2);
      while Count > 0 do
      begin
        Result := MethodInfo;
        if
{$IFDEF DELPHI2009}
        SamePropTypeName
{$ELSE}SameText{$ENDIF}
          (Result^.Name, MethodName) then
          Exit;
        Inc(integer(MethodInfo), PMethodInfoHeader(MethodInfo)^.Len);
        Dec(Count);
      end;
    end;
    // Find the parent VMT
    VMT := PPointer(integer(VMT) + vmtParent)^;
    if VMT = nil then
    begin
      Result := nil;
      Exit;
    end;

    VMT := PPointer(VMT)^;
  until False;
end;

resourcestring
  sMethodNotFound = 'Method %s of class %s not found';
  sTypeMisMatch   = 'Type mismatch in parameter %d for method %s';
  sInvalidDispID  = 'Invalid DispID for parameter %d in method %s';
  sParamRequired  = 'Parameter %d required for method %s';
  sMethodOver     = 'Method definition for %s has over %d parameters';
  sTooManyParams  = 'Too many parameters for method %s';

 /// ObjectInvoke - function to dymically invoke a method of an object that
 /// has sufficient type information.
 ///   Instance -      the object to invoke the method on
 ///   MethodHeader -  the type information for the method obtained through
 ///                   GetMethodInfo.
 ///   ParamIndexs -   the indexs of the parameters. This assumes that the
 ///                   indexs are 1 offset. The number of indexs do not need
 ///                   to match the number of parameters. The parameters left
 ///                   over are assumed to fill in the holes left by indexs.
 ///                   Param indexs are assumed to be in lexical order, not
 ///                   inverse lexical order like Params.
 ///   Params -        the parameters for the function invocation. The
 ///                   order of the parameters is assumed to be in inverse
 ///                   lexical order, last parameter first.

function ObjectInvoke(Instance: TObject; MethodHeader: PMethodInfoHeader;
  const ParamIndexes: array of integer; const Params: array of variant): variant;
const
  MaxParams = 32;

  procedure Swap(var A, B: PParamInfo);
  var
    T: PParamInfo;
  begin
    T := A;
    A := B;
    B := T;
  end;

var
  MethodName: string;

  procedure ParameterMismatch(I: integer);
  begin
    raise Exception.CreateFmt(sTypeMisMatch, [I, MethodName]);
  end;

var
  MethodInfo: Pointer;
  ReturnInfo: PReturnInfo;
  MethodAddr: Pointer;
  InfoEnd:  Pointer;
  Count:    integer;
  I, K, P:  integer;
  Param:    PParamInfo;
  Regs:     array[paEAX..paECX] of cardinal;
  RetVal:   variant;
  ParamType: TVarType;
  VarType:  TVarType;
  ParamVarData: PVarData;
  PushData: Pointer;
  ParamBytes: integer;
  Size:     integer;
  Frame:
{$IFDEF DELPHI2009}
            PByte
{$ELSE}PChar{$ENDIF}
  ;
  ResultParam: Pointer;
  ResultPointer: Pointer;
  ParamInfos: array[0..MaxParams - 1] of PParamInfo;
  ParamData: array[0..MaxParams - 1] of Pointer;
  Pointers: array[0..MaxParams - 1] of Pointer;
  Temps:    array[0..MaxParams - 1] of variant;
begin
  // MethodInfo now points to the method we found.
  MethodInfo := MethodHeader;
  MethodAddr := MethodHeader^.Addr;
  MethodName :=
{$IFDEF DELPHI2009}
    UTF8ToString(
{$ENDIF}
    PMethodInfoHeader(MethodInfo)^.Name
{$IFDEF DELPHI2009}
    )
{$ENDIF}
  ;
  Inc(integer(MethodInfo), SizeOf(TMethodInfoHeader) - SizeOf(ShortString) +
    1 + Length(MethodName));
  ReturnInfo := MethodInfo;
  Inc(integer(MethodInfo), SizeOf(TReturnInfo));

  InfoEnd := Pointer(integer(MethodHeader) + MethodHeader^.Len);
  Count   := 0;
  while integer(MethodInfo) < integer(InfoEnd) do
  begin
    if Count >= MaxParams then
      raise Exception.CreateFmt(sMethodOver, [MethodName, MaxParams]);
    ParamInfos[Count] := MethodInfo;
    Inc(Count);
    Inc(integer(MethodInfo), SizeOf(TParamInfo) - SizeOf(ShortString) + 1 +
      Length(PParamInfo(MethodInfo)^.Name));
  end;

  if High(Params) >= Count then
    raise Exception.CreateFmt(sTooManyParams, [MethodName]);

  // Fill the ParamData array, converting the type as necessary, taking
  // into account any ParamIndexes supplied
  P := 0;
  FillChar(ParamData, SizeOf(ParamData), 0);
  for I := 0 to High(Params) do
  begin
    // Figure out what parameter index this parameter refers to.
    // If it is a named parameter it will have an entry in the ParamIndexs
    // array. If not, P points to the current parameter to use for unnamed
    // parameters. K is the formal parameter number.
    // This calculation assumes Self is first and any result parameters are last
    if I <= High(ParamIndexes) then
    begin
      K := ParamIndexes[I];
      if K >= Count then
        raise Exception.CreateFmt(sInvalidDispID, [I, MethodName]);
    end
    else
      K := High(Params) - P + 1;  // Add one to account for Self
    Param := ParamInfos[K];
    ParamType    := GetVariantType(Param^.ParamType^);
    ParamVarData := @Params[I];
    VarType      := ParamVarData^.VType;
    if Param^.Flags * [pfOut, pfVar] <> [] then
    begin

      // For pfVar, the variant must be a byref and equal to the type.
      if (VarType <> ParamType or varByRef) and (ParamType <> varVariant) then
        ParameterMismatch(I);
    end
    else
      // Convert the parameter to the right type
      case ConvertKindOf(VarType and varTypeMask, ParamType) of
        ckConvert:
          try
            Temps[I] := VarAsType(Params[I], ParamType);
            // The data bytes for sizes < 4 are dirty, that is they are not
            // guarenteed to have 0's in the high bytes. We need them to be zero'ed
            if ParamType <= CMaxArrayVarType then
              case CVarTypeToElementInfo[ParamType].Size of
                1: TVarData(Temps[I]).VLongWord := TVarData(Temps[I]).VByte;
                2: TVarData(Temps[I]).VLongWord := TVarData(Temps[I]).VWord;
              end;
            ParamVarData := @Temps[I];
          except
            ParameterMismatch(I);
          end;
        ckError: ParameterMismatch(I);
      end;

    if ParamType = varVariant then
    begin
      Pointers[K]  := ParamVarData;
      ParamData[K] := @Pointers[K];
    end
    else if varByRef and VarType <> 0 then
      ParamData[K] := @ParamVarData^.VPointer
    else
      ParamData[K] := @ParamVarData^.VInteger;

    // Update P which is the pointer to the current non-named parameter.
    // This assumes that unnamed parameter fill in the holes left by
    // named parameters.
    while (P <= High(Params)) and (ParamData[High(Params) - P + 1] <> nil) do
      Inc(P);
  end;

  // Set up the call frame        RET EBP
  ParamBytes := ReturnInfo^.ParamSize - (4 + 4);
  asm
    SUB     ESP,ParamBytes
    MOV     Frame,ESP
  end;
  Dec(integer(Frame), 4 + 4); // Access numbers include RET and EBP

  // Push the parameters on the stack (or put them into the correct register)
  ResultParam := nil;
  for I := 0 to Count - 1 do
  begin
    Param    := ParamInfos[I];
    PushData := ParamData[I];
    if PushData = nil then
      if (Param^.ParamType^.Kind = tkClass) and
{$IFDEF DELPHI2009}
        SamePropTypeName
{$ELSE}SameText{$ENDIF}
        (Param^.Name, 'SELF') then
        // Self is special. It doesn't appear in the ParamData array since it
        // is not represented in the Params array.
        PushData := @Instance
      else if pfResult in Param^.Flags then
      begin
        ResultParam := Param;
        VarClear(Result);
        TVarData(Result).VType := GetVariantType(Param^.ParamType^);
        if TVarData(Result).VType = varVariant then
          ResultPointer := @Result
        else
          ResultPointer := @TVarData(Result).VInteger;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本91福利区| 国产乱码精品一区二区三区五月婷| 色婷婷av一区二区三区gif| 国内外成人在线视频| 视频一区国产视频| 亚洲成人免费看| 亚洲一区二区三区在线播放| 亚洲欧美日韩久久精品| 国产精品五月天| 91在线精品一区二区三区| 亚洲人成7777| 国产精品国产馆在线真实露脸 | 91免费国产在线| 亚洲视频一区二区免费在线观看| 色综合天天综合在线视频| 亚洲超碰精品一区二区| 日韩精品一区二区三区蜜臀| 国内精品国产成人| 亚洲三级在线免费观看| 欧美日韩亚洲国产综合| 精品在线视频一区| 国产精品毛片高清在线完整版| 日本电影亚洲天堂一区| 狂野欧美性猛交blacked| 国产欧美一区二区精品忘忧草 | 国产成人av电影免费在线观看| 综合欧美一区二区三区| 欧美一区二区在线观看| 成人教育av在线| 午夜在线电影亚洲一区| 26uuu精品一区二区| av电影在线观看不卡| 日韩黄色小视频| 亚洲国产精品国自产拍av| 欧美一a一片一级一片| 蜜臀av一区二区在线免费观看| 国产亚洲精品中文字幕| 欧美天堂一区二区三区| 国产麻豆成人传媒免费观看| 一区二区三区四区亚洲| 亚洲人成伊人成综合网小说| 8v天堂国产在线一区二区| 国产91露脸合集magnet| 亚洲影院免费观看| 久久久久久久久久久电影| 在线观看国产精品网站| 国产精品亚洲第一区在线暖暖韩国| 一区二区三区中文在线| 久久久久久久网| 欧美一区二区大片| 色婷婷国产精品综合在线观看| 国产精品原创巨作av| 图片区日韩欧美亚洲| 中文字幕一区在线观看| 久久奇米777| 制服丝袜日韩国产| 国产最新精品精品你懂的| 欧美电影在哪看比较好| 日韩av在线播放中文字幕| 欧美一级在线免费| 国产福利不卡视频| 亚洲私人影院在线观看| 91在线码无精品| 久久精品国产在热久久| 久久久久久久精| 99久久综合国产精品| 亚洲国产日韩在线一区模特| 在线成人av影院| 成人成人成人在线视频| 五月天亚洲精品| 国产亚洲综合性久久久影院| 国产99精品在线观看| 天堂蜜桃91精品| 欧美综合天天夜夜久久| 另类的小说在线视频另类成人小视频在线| 3d动漫精品啪啪| 亚洲综合小说图片| 日韩一区和二区| 成人午夜免费视频| 欧美日韩黄色影视| 亚洲精品国久久99热| 欧美精品久久天天躁| av影院午夜一区| 成人污视频在线观看| 成人午夜伦理影院| 粉嫩嫩av羞羞动漫久久久| 成人黄色一级视频| 福利一区福利二区| 高清免费成人av| av影院午夜一区| 色婷婷av一区二区三区大白胸| 欧美在线免费播放| 国产日本欧洲亚洲| 欧美精品18+| 欧美日韩国产综合草草| 色综合久久久网| 日韩女优电影在线观看| 欧美精三区欧美精三区| 日韩三区在线观看| 欧美亚洲图片小说| 欧美日韩久久不卡| 欧美三级韩国三级日本一级| 国产精品亚洲综合一区在线观看| 国产在线视视频有精品| 麻豆国产精品一区二区三区| 精品综合免费视频观看| av午夜一区麻豆| av一区二区久久| 欧美日韩精品电影| 91精品国模一区二区三区| 欧美性大战久久久久久久蜜臀| 色婷婷激情久久| 国产99久久久国产精品潘金| 国产成人精品免费在线| 麻豆精品在线视频| 日韩中文字幕不卡| 成人激情小说乱人伦| 亚洲一区二区三区四区不卡| 国产精品日产欧美久久久久| 欧美大片免费久久精品三p| 久久久国产精品午夜一区ai换脸| 99精品视频在线免费观看| 99re热这里只有精品免费视频| 日韩美女视频一区二区在线观看| 日韩一区二区免费电影| 韩国av一区二区| 色菇凉天天综合网| 欧美成人免费网站| 国产精品国产三级国产aⅴ入口| 亚洲国产精品欧美一二99| 美日韩一级片在线观看| 不卡的电视剧免费网站有什么| 欧美三级视频在线| 久久精品这里都是精品| 亚洲国产精品一区二区www在线| 韩国午夜理伦三级不卡影院| 91视频xxxx| 精品剧情v国产在线观看在线| 亚洲色图欧洲色图婷婷| 精品综合久久久久久8888| 欧美亚日韩国产aⅴ精品中极品| 久久在线观看免费| 亚洲成av人片观看| 国产大陆亚洲精品国产| 欧美日产在线观看| ...av二区三区久久精品| 久久精品国内一区二区三区| 欧美在线看片a免费观看| 中文字幕成人av| 奇米888四色在线精品| 日本丰满少妇一区二区三区| 国产亚洲一区字幕| 美女一区二区三区| 欧美日韩国产一二三| 综合久久国产九一剧情麻豆| 国产成人亚洲综合a∨婷婷图片| 亚洲色图制服丝袜| 国产精品一品视频| 欧美高清www午色夜在线视频| 亚洲欧美视频在线观看视频| 国产69精品久久777的优势| 日韩欧美国产午夜精品| 五月天欧美精品| 欧美性大战xxxxx久久久| 亚洲情趣在线观看| eeuss影院一区二区三区| 国产欧美一区二区在线观看| 韩国v欧美v日本v亚洲v| 亚洲精品一区二区三区影院| 日韩电影免费一区| 欧美性感一区二区三区| 亚洲一区二区三区四区中文字幕| 91首页免费视频| 中文幕一区二区三区久久蜜桃| 国产一区不卡精品| 久久婷婷国产综合精品青草| 精品一区二区av| 久久综合色婷婷| 国内精品伊人久久久久影院对白| 欧美一二三四在线| 久草热8精品视频在线观看| 日韩你懂的在线观看| 精品夜夜嗨av一区二区三区| 精品乱人伦一区二区三区| 国产一区二区三区不卡在线观看 | 国产一区二区视频在线| 精品三级在线看| 国产精一品亚洲二区在线视频| 久久精品亚洲国产奇米99| 国产.欧美.日韩| |精品福利一区二区三区| 欧美三级电影一区| 久久国产精品免费| 亚洲国产成人在线| 91浏览器打开| 日韩国产一区二| 热久久免费视频| 精品国产91久久久久久久妲己| 福利91精品一区二区三区| 亚洲精品视频在线看|