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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? objautox.pas

?? 在delphi下實現(xiàn)類似于java, C#等反射調(diào)用的一個例子
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
        PushData := @ResultPointer;
      end
      else
        raise Exception.CreateFmt(sParamRequired, [I, MethodName]);
    if Param^.Access < word(Ord(paStack)) then
      Regs[Param^.Access] := PCardinal(PushData)^
    else
    begin
      if [pfVar, pfOut, pfResult] * Param^.Flags <> [] then
        PCardinal(@Frame[Param^.Access])^ := PCardinal(PushData)^
      else
      begin
        Size := GetTypeSize(Param^.ParamType^);
        case Size of
          1, 2, 4:
            PCardinal(@Frame[Param^.Access])^ := PCardinal(PushData)^;
          8:
          begin
            PCardinal(@Frame[Param^.Access])^     := PCardinal(PushData)^;
            PCardinal(@Frame[Param^.Access + 4])^ :=
              PCardinal(integer(PushData) + 4)^;
          end;
          else
            Move(PushData^, Frame[Param^.Access and not 3], Size);
        end;
      end;
    end;
  end;

  // Do the call
  asm
    MOV     EAX,DWORD PTR Regs[0]
    MOV     EDX,DWORD PTR Regs[4]
    MOV     ECX,DWORD PTR Regs[8]
    CALL    MethodAddr
    MOV     DWORD PTR Regs[0],EAX
    MOV     DWORD PTR Regs[4],EDX
  end;

  if ReturnInfo^.CallingConvention = ccCdecl then
    asm
      ADD     ESP,ParamBytes
    end;

  if (ResultParam = nil) and (ReturnInfo^.ReturnType <> nil) then
  begin
    // The result came back in registers. Otherwise a result pointer was used
    // and the return variant is already initialized (or it was a procedure)
    TVarData(RetVal).VType := GetVariantType(ReturnInfo^.ReturnType^);
    if ReturnInfo^.ReturnType^.Kind = tkFloat then
      GetFloatReturn(TVarData(RetVal).VDouble,
        GetTypeData(ReturnInfo^.ReturnType^)^.FloatType)
    else
    begin
      // For regular Boolean types, we must convert it to a boolean to
      // wipe the high order bytes; otherwise the caller may see a false
      // as true.
      if (TVarData(RetVal).VType = varBoolean) and
        (ReturnInfo^.ReturnType^ = System.TypeInfo(boolean)) then
        TVarData(RetVal).VInteger := integer(boolean(Regs[paEAX]))
      else
        TVarData(RetVal).VInteger := integer(Regs[paEAX]);
      PCardinal(integer(@TVarData(RetVal).VInteger) + 4)^ := Regs[paEDX];
    end;
    Result := RetVal;
    TVarData(RetVal).VType := varEmpty;
  end;
end;

function GetReturnInfo(Instance: TObject; MethodName: string): PReturnInfo;
var
  mi: PMethodInfoHeader;
begin
  mi := GetMethodInfo(Instance, ShortString(MethodName));
  if mi.Len <= SizeOf(TMethodInfoHeader) + Length(mi.Name) - SHORT_LEN then
  begin
    Result := nil;
    Exit;
  end;
  Result := PReturnInfo(integer(mi) + SizeOf(TMethodInfoHeader) +
    Length(mi.Name) - SHORT_LEN);
end;

function GetParams(Instance: TObject; MethodName: string): TParamInfoArray;
var
  mi:    PMethodInfoHeader;
  miEnd: Pointer;
  param: PParamInfo;
  Count: integer;
begin
  SetLength(Result, 0);
  mi := GetMethodInfo(Instance, ShortString(MethodName));
  if mi.Len <= SizeOf(TMethodInfoHeader) + Length(mi.Name) - SHORT_LEN then
    Exit;
  miEnd := Pointer(integer(mi) + mi.Len);
  param := PParamInfo(integer(mi) + SizeOf(TMethodInfoHeader) +
    Length(mi.Name) - SHORT_LEN + SizeOf(TReturnInfo));
  Count := 0;
  while integer(param) < integer(miEnd) do
  begin
    Inc(Count);
    SetLength(Result, Count);
    Result[Count - 1] := param;
    param := PParamInfo(integer(param) + SizeOf(TParamInfo) +
      Length(param.Name) - SHORT_LEN);
  end;
end;

type
  PParameterInfos = ^TParameterInfos;
  TParameterInfos = array[0..255] of ^PTypeInfo;

  TBaseMethodHandlerInstance = class
  protected
    TypeData:     PTypeData;
    ParamInfos:   PParameterInfos;
    ParamOffsets: array of word;
    StackSize:    integer;
    procedure InternalHandler(Params: Pointer);
    procedure Handler(Params: Pointer); virtual; abstract;
    procedure RegisterStub;
  public
    constructor Create(TypeData: PTypeData);
  end;

  TMethodHandlerInstance = class(TBaseMethodHandlerInstance)
  protected
    MethodHandler: IMethodHandler;
    procedure Handler(Params: Pointer); override;
  public
    constructor Create(const MethodHandler: IMethodHandler; TypeData: PTypeData);
  end;

  TEventHandlerInstance = class(TBaseMethodHandlerInstance)
  protected
    FDynamicInvokeEvent: TDynamicInvokeEvent;
    procedure Handler(Params: Pointer); override;
  public
    constructor Create(const ADynamicInvokeEvent: TDynamicInvokeEvent;
      TypeData: PTypeData);
  end;

function AdditionalInfoOf(TypeData: PTypeData): Pointer;
var
  P:
{$IFDEF DELPHI2009}
     PByte
{$ELSE}PChar{$ENDIF}
  ;
  I: integer;
begin
  P := @TypeData^.ParamList;
  // Skip parameter names and types
  for I := 1 to TypeData^.ParamCount do
  begin
    Inc(P, 1 +
{$IFNDEF DELPHI2009}Byte{$ENDIF}
      (P[1]) + 1);
    Inc(P,
{$IFNDEF DELPHI2009}Byte{$ENDIF}
      (P[0]) + 1);
  end;
  if TypeData^.MethodKind = mkFunction then
    // Skip return type name and info
    Inc(P,
{$IFNDEF DELPHI2009}Byte{$ENDIF}
      (P[0]) + 1 + 4);
  Result := P;
end;

function CreateMethodPointer(const MethodHandler: IMethodHandler;
  TypeData: PTypeData): TMethod;
begin
  Result.Data := TMethodHandlerInstance.Create(MethodHandler, TypeData);
  Result.Code := @TMethodHandlerInstance.RegisterStub;
end;

function CreateMethodPointer(const ADynamicInvokeEvent: TDynamicInvokeEvent;
  TypeData: PTypeData): TMethod; overload;
begin
  Result.Data := TEventHandlerInstance.Create(ADynamicInvokeEvent, TypeData);
  Result.Code := @TMethodHandlerInstance.RegisterStub;
end;

procedure ReleaseMethodPointer(MethodPointer: TMethod);
begin
  TObject(MethodPointer.Data).Free;
end;

function GetInvokeInstance(MethodPointer: TMethod): TObject;
begin
  if TObject(MethodPointer.Data) is TEventHandlerInstance then
    Result := TObject(TMethod(TEventHandlerInstance(
      MethodPointer.Data).FDynamicInvokeEvent).Data)
  else
    Result := nil;
end;

{ TBaseMethodHandlerInstance }

constructor TBaseMethodHandlerInstance.Create(TypeData: PTypeData);
var
  P:
{$IFDEF DELPHI2009}
          PByte
{$ELSE}PChar{$ENDIF}
  ;
  Offset: integer;
  CurReg: integer;
  I:      integer;
  Size:   integer;
begin
  Self.TypeData := TypeData;

  P          := AdditionalInfoOf(TypeData);
  ParamInfos := PParameterInfos(cardinal(P) + 1);

  // Calculate stack size
  CurReg    := paEDX;
  P         := @TypeData^.ParamList;
  StackSize := 0;
  for I := 0 to TypeData^.ParamCount - 1 do
  begin
    if TParamFlags(P[0]) * [pfVar, pfConst, pfAddress, pfReference, pfOut] <> [] then
      Size := 4
    else
      Size := GetTypeSize(ParamInfos^[I]^);
    if (Size <= 4) and (CurReg <= paECX) then
      Inc(CurReg)
    else
      Inc(StackSize, Size);
    Inc(P, 1 +
{$IFNDEF DELPHI2009}Byte{$ENDIF}
      (P[1]) + 1);
    Inc(P,
{$IFNDEF DELPHI2009}Byte{$ENDIF}
      (P[0]) + 1);
  end;

  // Calculate parameter offsets
  SetLength(ParamOffsets, TypeData^.PropCount);
  CurReg := paEDX;
  P      := @TypeData^.ParamList;
  Offset := StackSize;
  for I := 0 to TypeData^.ParamCount - 1 do
  begin
    if TParamFlags(P[0]) * [pfVar, pfConst, pfAddress, pfReference, pfOut] <> [] then
      Size := 4
    else
      Size := GetTypeSize(ParamInfos^[I]^);
    if (Size <= 4) and (CurReg <= paECX) then
    begin
      ParamOffsets[I] := CurReg;
      Inc(CurReg);
    end
    else
    begin
      Dec(Offset, Size);
      ParamOffsets[I] := Offset;
    end;
    Inc(P, 1 +
{$IFNDEF DELPHI2009}Byte{$ENDIF}
      (P[1]) + 1);
    Inc(P,
{$IFNDEF DELPHI2009}Byte{$ENDIF}
      (P[0]) + 1);
  end;
end;

procedure TBaseMethodHandlerInstance.InternalHandler(Params: Pointer);
asm
  MOV     ECX,[EAX]
  JMP     DWORD PTR [ECX] + VMTOFFSET TMethodHandlerInstance.Handler
end;

procedure TBaseMethodHandlerInstance.RegisterStub;
const
  PtrSize = SizeOf(Pointer);
asm
  PUSH    EAX
  PUSH    ECX
  PUSH    EDX
  MOV     EDX,ESP
  CALL    InternalHandler
  // Pop EDX and ECX off the stack while preserving all registers.
  MOV[ESP+4],EAX
  POP     EAX
  POP     EAX
  POP     ECX    // Self
  MOV     ECX,[ECX].TMethodHandlerInstance.StackSize
  TEST    ECX,ECX
  JZ      @@SimpleRet
  // Jump to the actual return instruction since it is most likely not just a RET
  //JMP     ECX    // Data Exec. Prevention: Jumping into a GetMem allocated memory block

  // stack address alignment
  ADD     ECX, PtrSize - 1
  and     ECX, not (PtrSize - 1)
  and     ECX, $FFFF

  // clean up the stack
  PUSH    EAX                         // we need this register, so save it
  MOV     EAX,[ESP + 4]               // Load the return address
  MOV[ESP + ECX + 4], EAX        // Just blast it over the first param on the stack
  POP     EAX
  ADD     ESP,ECX                     // This will move the stack back to where the moved
  // return address is now located. The next RET
  // instruction will do the final stack cleanup
  @@SimpleRet:
end;

{ TMethodHandlerInstance }

constructor TMethodHandlerInstance.Create(const MethodHandler: IMethodHandler;
  TypeData: PTypeData);
begin
  inherited Create(TypeData);
  Self.MethodHandler := MethodHandler;
end;

procedure TMethodHandlerInstance.Handler(Params: Pointer);
const
  MaxParams = 10;
var
  P:
{$IFDEF DELPHI2009}
          PByte
{$ELSE}PChar{$ENDIF}
  ;
  Parameters: PParameters;
  ReturnValue: variant;
  ParamValues: array[0..MaxParams - 1] of variant;
  I:      integer;
  Regs:   array[paEAX..paEDX] of cardinal;
  Offset: integer;
  Data:   Pointer;
  Temp:   variant;
begin
  Parameters := Params;

  // Fetch the parameters into ParamValues
  P := @TypeData^.ParamList;
  for I := 0 to TypeData^.ParamCount - 1 do
  begin
    Offset := ParamOffsets[I];
    if (Offset >= paEDX) and (Offset <= paECX) then
      Data := @Parameters^.Registers[Offset]
    else
      Data := @Parameters^.Stack[Offset];
    if ParamInfos^[I]^.Kind = tkClass then
      ParamValues[TypeData^.ParamCount - I - 1] :=
        MethodHandler.InstanceToVariant(PPointer(Data)^)
    else if TParamFlags(P[0]) * [pfVar, pfOut] <> [] then
      with TVarData(ParamValues[TypeData^.ParamCount - I - 1]) do
      begin
        VType    := GetVariantType(ParamInfos[I]^) or varByRef;
        VPointer := Pointer(PCardinal(Data)^);
      end
    else
    begin
      TVarData(Temp).VType := GetVariantType(ParamInfos[I]^) or varByRef;
      if TParamFlags(P[0]) * [pfVar, pfOut] <> [] then
        TVarData(Temp).VPointer := Pointer(PCardinal(Data)^)
      else
        TVarData(Temp).VPointer := Data;
      ParamValues[TypeData^.ParamCount - I - 1] := Temp;
    end;
    Inc(P, 1 +
{$IFNDEF DELPHI2009}Byte{$ENDIF}
      (P[1]) + 1);
    Inc(P,
{$IFNDEF DELPHI2009}Byte{$ENDIF}
      (P[0]) + 1);
  end;
  // P is left pointing to the return type name if there is one.

  ReturnValue := MethodHandler.Execute(Slice(ParamValues, TypeData^.ParamCount));
  if TypeData^.MethodKind = mkFunction then
  begin
    Inc(P,
{$IFNDEF DELPHI2009}Byte{$ENDIF}
      (P[0]) + 1);
    ReturnValue := VarAsType(ReturnValue, GetVariantType(PPTypeInfo(P)^));
    if PPTypeInfo(P)^.Kind = tkFloat then

    else
    begin
      Regs[paEAX] := TVarData(ReturnValue).VLongWord;
      Regs[paEDX] := PCardinal(integer(@TVarData(ReturnValue).VLongWord) + 4)^;
    end;
  end;

  // Let Stub procedures know where the RET instruction is
  asm
    MOV     EAX,DWORD PTR Regs[paEAX*4]
    MOV     EDX,DWORD PTR Regs[paEDX*4]
  end;
end;

{ TEventHandlerInstance }

constructor TEventHandlerInstance.Create(const ADynamicInvokeEvent: TDynamicInvokeEvent;
  TypeData: PTypeData);
begin
  inherited Create(TypeData);
  Self.FDynamicInvokeEvent := ADynamicInvokeEvent;
end;

procedure TEventHandlerInstance.Handler(Params: Pointer);
begin
  if Assigned(FDynamicInvokeEvent) then
    FDynamicInvokeEvent(Params, StackSize);
end;

end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区二区三区swag | 91久久精品网| 国产精品视频一二三| 成人黄色在线视频| 亚洲欧美日韩国产综合| 欧美午夜免费电影| 麻豆91免费看| 欧美高清在线视频| 欧美艳星brazzers| 蜜桃久久av一区| 欧美国产综合色视频| 色婷婷激情一区二区三区| 丝瓜av网站精品一区二区| 日韩欧美一级在线播放| 国产91高潮流白浆在线麻豆 | 日本少妇一区二区| 久久亚洲影视婷婷| 97se亚洲国产综合自在线不卡| 亚洲猫色日本管| 91精品国产综合久久久久久 | 精品成人a区在线观看| 成人一区二区三区视频在线观看 | 亚洲美女电影在线| 欧美成人精品二区三区99精品| 成人免费精品视频| 天堂在线亚洲视频| 中文字幕av一区二区三区免费看 | 久久精品网站免费观看| 99精品视频一区| 日本欧美韩国一区三区| 国产精品私房写真福利视频| 欧美日韩成人一区| 成人精品电影在线观看| 欧美bbbbb| 自拍偷自拍亚洲精品播放| 日韩一区二区高清| 91天堂素人约啪| 国产一区二区三区久久久| 亚洲精品精品亚洲| 日本一区二区三区在线不卡| 91麻豆精品国产91| 欧美专区在线观看一区| 成人动漫在线一区| 国内精品久久久久影院色| 亚洲图片一区二区| 亚洲男人电影天堂| 国产日韩亚洲欧美综合| 欧美tk—视频vk| 欧美视频精品在线| 91在线视频网址| 国产精品香蕉一区二区三区| 日本欧美韩国一区三区| 亚洲国产视频一区二区| 一色屋精品亚洲香蕉网站| 久久日韩精品一区二区五区| 欧美电影在哪看比较好| 欧美在线观看你懂的| a在线欧美一区| 国产福利一区二区| 久久99精品国产.久久久久 | 成人免费在线观看入口| 久久久久国产一区二区三区四区| 欧美日韩免费电影| 欧美三级电影在线看| 一本大道av一区二区在线播放 | 日本大香伊一区二区三区| 成人黄页毛片网站| 成人免费福利片| 国产69精品久久99不卡| 成人性视频免费网站| 国产成人av一区二区三区在线 | 在线看不卡av| 欧美性猛交xxxxxxxx| 一本到不卡免费一区二区| 99re热视频这里只精品 | 91国产福利在线| 色婷婷一区二区| 91福利在线免费观看| 欧美艳星brazzers| 欧美丰满美乳xxx高潮www| 制服丝袜一区二区三区| 欧美不卡在线视频| 精品国产乱子伦一区| 久久蜜桃av一区精品变态类天堂| 精品播放一区二区| 国产精品免费av| 亚洲免费观看高清完整版在线观看熊 | 成人永久免费视频| 色诱视频网站一区| 欧美日韩电影一区| 日韩精品在线一区二区| 久久婷婷成人综合色| 中文字幕中文在线不卡住| 亚洲精品自拍动漫在线| 亚洲一区在线观看免费 | 波多野结衣在线一区| 91丨porny丨中文| 欧美日韩一区 二区 三区 久久精品| 欧美日本在线播放| 精品少妇一区二区三区在线视频| 久久久久久久国产精品影院| 亚洲丝袜美腿综合| 石原莉奈在线亚洲三区| 国产一区久久久| 99久久久久久| 4438x成人网最大色成网站| 26uuu精品一区二区| 亚洲免费色视频| 开心九九激情九九欧美日韩精美视频电影 | 欧美日韩五月天| 久久噜噜亚洲综合| 亚洲精品日韩专区silk| 久久99蜜桃精品| 色综合久久综合网97色综合| 日韩一本二本av| 亚洲精品写真福利| 精品一区二区三区欧美| 色婷婷综合久久久中文字幕| 日韩精品中文字幕在线不卡尤物| 国产精品理论在线观看| 蜜桃传媒麻豆第一区在线观看| 成人av免费网站| 欧美成人伊人久久综合网| 亚洲婷婷国产精品电影人久久| 丝袜美腿亚洲一区二区图片| 成人自拍视频在线观看| 日韩亚洲欧美成人一区| 日韩毛片一二三区| 久久福利资源站| 欧美午夜影院一区| 国产精品剧情在线亚洲| 久久99精品国产麻豆不卡| 欧美这里有精品| 国产精品午夜免费| 国产一区二区网址| 欧美精品在线视频| 一区二区三区欧美视频| 国产91丝袜在线观看| 日韩美女视频一区二区在线观看| 亚洲激情欧美激情| 成人h精品动漫一区二区三区| 精品国产网站在线观看| 亚洲成人先锋电影| 在线亚洲免费视频| 中文字幕一区二区三区不卡在线| 国产在线精品视频| 日韩亚洲欧美中文三级| 香蕉久久一区二区不卡无毒影院 | 91一区一区三区| 国产精品沙发午睡系列990531| 日韩中文字幕麻豆| 欧美日韩一区二区在线视频| 亚洲精品视频在线看| jlzzjlzz亚洲日本少妇| 国产视频一区在线观看| 韩国中文字幕2020精品| 精品国产一区久久| 韩日欧美一区二区三区| 26uuu精品一区二区三区四区在线| 青青草原综合久久大伊人精品| 欧美手机在线视频| 亚洲国产精品久久不卡毛片| 在线免费不卡视频| 亚洲一区在线视频| 欧美日韩黄色影视| 日韩va欧美va亚洲va久久| 欧美日韩精品一区视频| 日精品一区二区三区| 在线播放日韩导航| 日本美女一区二区三区| 欧美一区二区日韩| 麻豆国产欧美一区二区三区| 日韩一区二区视频| 久久不见久久见中文字幕免费| 日韩视频免费观看高清完整版| 人人狠狠综合久久亚洲| 欧美精品一区二区三区蜜桃| 国产酒店精品激情| 国产精品第四页| 在线精品视频一区二区| 视频在线在亚洲| 精品福利在线导航| 懂色av中文一区二区三区| 中文字幕在线观看一区| 色天使色偷偷av一区二区| 亚洲大片免费看| 精品国产sm最大网站免费看| 国产精一区二区三区| 国产精品久久久久久久久久久免费看 | 欧美精品一区二区三区在线 | 亚洲国产精品二十页| 99久久久无码国产精品| 五月激情综合色| 精品国内二区三区| 成人av电影免费在线播放| 一区二区三区在线看| 日韩午夜激情av| 99精品久久久久久| 性久久久久久久久久久久| 久久久久久电影|