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

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

?? sconnectex.pas

?? 一般的數據庫管理系統 uses Classes, SConnectEx, TltConst, ExtCtrls, MMSystem, Types, windows, TltLogic , Sy
?? PAS
?? 第 1 頁 / 共 5 頁
字號:
    end;
  finally
    FreeMem(LoDim);
  end;
end;

procedure TDataBlockInterpreter.WriteArray(const Value: OleVariant;
  const Data: IDataBlock);
var
  VType, VSize, i, DimCount, ElemSize: Integer;
  LSafeArray: PSafeArray;
  LoDim, HiDim, Indices: PIntArray;
  V: OleVariant;
  P: Pointer;
begin
  VType := VarType(Value);
  LSafeArray := PSafeArray(TVarData(Value).VPointer);
  Data.Write(VType, SizeOf(Integer));
  DimCount := VarArrayDimCount(Value);
  Data.Write(DimCount, SizeOf(DimCount));
  VSize := SizeOf(Integer) * DimCount;
  GetMem(LoDim, VSize);
  try
    GetMem(HiDim, VSize);
    try
      for i := 1 to DimCount do
      begin
        LoDim[i - 1] := VarArrayLowBound(Value, i);
        HiDim[i - 1] := VarArrayHighBound(Value, i);
      end;
      Data.Write(LoDim^,VSize);
      Data.Write(HiDim^,VSize);
      if VType and varTypeMask in EasyArrayTypes then
      begin
        ElemSize := SafeArrayGetElemSize(LSafeArray);
        VSize := 1;
        for i := 0 to DimCount - 1 do
          VSize := (HiDim[i] - LoDim[i] + 1) * VSize;
        VSize := VSize * ElemSize;
        P := VarArrayLock(Value);
        try
          Data.Write(VSize, SizeOf(VSize));
          Data.Write(P^,VSize);
        finally
          VarArrayUnlock(Value);
        end;
      end else
      begin
        GetMem(Indices, VSize);
        try
          for I := 0 to DimCount - 1 do
            Indices[I] := LoDim[I];
          while True do
          begin
            if VType and varTypeMask <> varVariant then
            begin
              OleCheck(SafeArrayGetElement(LSafeArray, Indices^, TVarData(V).VPointer));
              TVarData(V).VType := VType and varTypeMask;
            end else
              OleCheck(SafeArrayGetElement(LSafeArray, Indices^, V));
            WriteVariant(V, Data);
            Inc(Indices[DimCount - 1]);
            if Indices[DimCount - 1] > HiDim[DimCount - 1] then
              for i := DimCount - 1 downto 0 do
                if Indices[i] > HiDim[i] then
                begin
                  if i = 0 then Exit;
                  Inc(Indices[i - 1]);
                  Indices[i] := LoDim[i];
                end;
          end;
        finally
          FreeMem(Indices);
        end;
      end;
    finally
      FreeMem(HiDim);
    end;
  finally
    FreeMem(LoDim);
  end;
end;

function TDataBlockInterpreter.ReadVariant(out Flags: TVarFlags;
  const Data: IDataBlock): OleVariant;
var
  I, VType: Integer;
  W: WideString;
  TmpFlags: TVarFlags;
begin
  VarClear(Result);
  Flags := [];
  Data.Read(VType, SizeOf(VType));
  if VType and varByRef = varByRef then Include(Flags, vfByRef);
  if VType = varByRef then
  begin
    Include(Flags, vfVariant);
    Result := ReadVariant(TmpFlags, Data);
    Exit;
  end;
  if vfByRef in Flags then VType := VType xor varByRef;
  if (VType and varArray) = varArray then
    Result := ReadArray(VType, Data) else
  case VType and varTypeMask of
    varEmpty: VarClear(Result);
    varNull: Result := NULL;
    varOleStr:
    begin
      Data.Read(I, SizeOf(Integer));
      SetLength(W, I);
      Data.Read(W[1], I * 2);
      Result := W;
    end;
    varDispatch:
    begin
      Data.Read(I, SizeOf(Integer));
      Result := TDataDispatch.Create(Self, I) as IDispatch;
    end;
    varUnknown:
      raise EInterpreterError.CreateResFmt(@SBadVariantType,[IntToHex(VType,4)]);
  else
    TVarData(Result).VType := VType;
    Data.Read(TVarData(Result).VPointer, VariantSize[VType and varTypeMask]);
  end;
end;

function TDataBlockInterpreter.CanCreateObject(const ClassID: TGUID): Boolean;
begin
  Result := (FCheckRegValue = '') or
    (GetRegStringValue(SClsid + GuidToString(ClassID), FCheckRegValue) = SFlagOn);
end;

function TDataBlockInterpreter.InternalCreateObject(const ClassID: TGUID): OleVariant;
var
  Unk: IUnknown;
begin
  OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
    CLSCTX_LOCAL_SERVER or CLSCTX_REMOTE_SERVER, IUnknown, Unk));
  Result := Unk as IDispatch;
end;

function TDataBlockInterpreter.CreateObject(const Name: string): OleVariant;
var
  ClassID: TGUID;
begin
  if (Name[1] = '{') and (Name[Length(Name)] = '}') then
    ClassID := StringToGUID(Name) else
    ClassID := ProgIDToClassID(Name);
  if CanCreateObject(ClassID) then
    Result := InternalCreateObject(ClassID) else
    raise Exception.CreateResFmt(@SObjectNotAvailable, [GuidToString(ClassID)]);
end;

function TDataBlockInterpreter.StoreObject(const Value: OleVariant): Integer;
begin
  if not VarIsArray(FDispList) then
    FDispList := VarArrayCreate([0,10], varVariant);
  Result := 0;
  while Result <= VarArrayHighBound(FDispList, 1) do
    if VarIsClear(FDispList[Result]) then break else Inc(Result);
  if Result > VarArrayHighBound(FDispList, 1) then
    VarArrayRedim(FDispList, Result + 10);
  FDispList[Result] := Value;
end;

function TDataBlockInterpreter.LockObject(ID: Integer): IDispatch;
begin
  Result := FDispList[ID];
end;

procedure TDataBlockInterpreter.UnlockObject(ID: Integer; const Disp: IDispatch);
begin
end;

procedure TDataBlockInterpreter.ReleaseObject(ID: Integer);
begin
  if (ID >= 0) and (VarIsArray(FDispList)) and
     (ID < VarArrayHighBound(FDispList, 1)) then
    FDispList[ID] := UNASSIGNED;
end;

procedure TDataBlockInterpreter.WriteVariant(const Value: OleVariant;
  const Data: IDataBlock);
var
  I, VType: Integer;
  W: WideString;
begin
  VType := VarType(Value);
  if VarIsArray(Value) then
    WriteArray(Value, Data) else
  case (VType and varTypeMask) of
    varEmpty, varNull: Data.Write(VType, SizeOf(Integer));
    varOleStr:
    begin
      W := WideString(Value);
      I := Length(W);
      Data.Write(VType, SizeOf(Integer));
      Data.Write(I,SizeOf(Integer));
      Data.Write(W[1], I * 2);
    end;
    varDispatch:
    begin
      if VType and varByRef = varByRef then
        raise EInterpreterError.CreateResFmt(@SBadVariantType,[IntToHex(VType,4)]);
      I := StoreObject(Value);
      Data.Write(VType, SizeOf(Integer));
      Data.Write(I, SizeOf(Integer));
    end;
    varVariant:
    begin
      if VType and varByRef <> varByRef then
        raise EInterpreterError.CreateResFmt(@SBadVariantType,[IntToHex(VType,4)]);
      I := varByRef;
      Data.Write(I, SizeOf(Integer));
      WriteVariant(Variant(TVarData(Value).VPointer^), Data);
    end;
    varUnknown:
      raise EInterpreterError.CreateResFmt(@SBadVariantType,[IntToHex(VType,4)]);
  else
    Data.Write(VType, SizeOf(Integer));
    if VType and varByRef = varByRef then
      Data.Write(TVarData(Value).VPointer^, VariantSize[VType and varTypeMask]) else
      Data.Write(TVarData(Value).VPointer, VariantSize[VType and varTypeMask]);
  end;
end;

{ Sending Calls }

function TDataBlockInterpreter.CallGetServerList: OleVariant;
var
  Flags: TVarFlags;
  Data: IDataBlock;
begin
  Data := TDataBlock.Create as IDataBlock;
  Data.Signature := CallSig or asGetAppServers;
  Data := FSendDataBlock.Send(Data, True);
  Result := ReadVariant(Flags, Data);
end;

function TDataBlockInterpreter.CallCreateObject(Name: string): OleVariant;
var
  Flags: TVarFlags;
  Data: IDataBlock;
begin
  Data := TDataBlock.Create as IDataBlock;
  WriteVariant(Name, Data);
  Data.Signature := CallSig or asCreateObject;
  Data := FSendDataBlock.Send(Data, True);
  Result := ReadVariant(Flags, Data);
end;

procedure TDataBlockInterpreter.CallFreeObject(DispatchIndex: Integer);
var
  Data: IDataBlock;
begin
  Data := TDataBlock.Create as IDataBlock;
  WriteVariant(DispatchIndex, Data);
  Data.Signature := CallSig or asFreeObject;
  FSendDataBlock.Send(Data, False);
end;

function TDataBlockInterpreter.CallGetIDsOfNames(DispatchIndex: Integer;
  const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer;
  DispIDs: Pointer): HResult; stdcall;
var
  Flags: TVarFlags;
  Data: IDataBlock;
begin
  if NameCount <> 1 then
    Result := E_NOTIMPL else
  begin
    Data := TDataBlock.Create as IDataBlock;
    WriteVariant(DispatchIndex, Data);
    WriteVariant(WideString(POleStrList(Names)^[0]), Data);
    Data.Signature := CallSig or asGetID;
    Data := FSendDataBlock.Send(Data, True);
    Result := ReadVariant(Flags, Data);
    if Result = S_OK then
      PDispIdList(DispIDs)^[0] := ReadVariant(Flags, Data);
  end;
end;

function TDataBlockInterpreter.CallInvoke(DispatchIndex, DispID: Integer; const IID: TGUID; LocaleID: Integer;
  Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
var
  VarFlags: TVarFlags;
  PDest: PVarData;
  i: Integer;
  Data: IDataBlock;
begin
  Data := TDataBlock.Create as IDataBlock;
  WriteVariant(DispatchIndex, Data);
  WriteVariant(DispID, Data);
  WriteVariant(Flags, Data);
  WriteVariant(VarResult <> nil, Data);
  WriteVariant(PDispParams(@Params).cArgs, Data);
  WriteVariant(PDispParams(@Params).cNamedArgs, Data);
  for i := 0 to PDispParams(@Params).cNamedArgs - 1 do
    WriteVariant(PDispParams(@Params).rgdispidNamedArgs[i], Data);
  for i := 0 to PDispParams(@Params).cArgs - 1 do
    WriteVariant(OleVariant(PDispParams(@Params).rgvarg^[i]), Data);
  Data.Signature := CallSig or asInvoke;
  Data := FSendDataBlock.Send(Data, True);
  Result := ReadVariant(VarFlags, Data);
  if (Result = DISP_E_EXCEPTION) then
  begin
    PExcepInfo(ExcepInfo).scode := ReadVariant(VarFlags, Data);
    PExcepInfo(ExcepInfo).bstrDescription := ReadVariant(VarFlags, Data);
  end;
  for i := 0 to PDispParams(@Params).cArgs - 1 do
    with PDispParams(@Params)^ do
      if rgvarg^[i].vt and varByRef = varByRef then
      begin
        if rgvarg^[i].vt = (varByRef or varVariant) then
          PDest := @TVarData(TVarData(rgvarg^[i]).VPointer^) else
          PDest := @TVarData(rgvarg^[i]);
        CopyDataByRef(TVarData(ReadVariant(VarFlags, Data)), PDest^);
      end;
  if VarResult <> nil then
    PVariant(VarResult)^ := ReadVariant(VarFlags, Data);
end;

{ Receiving Calls }

procedure TDataBlockInterpreter.InterpretData(const Data: IDataBlock);
var
  Action: Integer;
begin
  Action := Data.Signature;
  if (Action and asMask) = asError then
    DoException(Data);
  try
    case (Action and asMask) of
      asInvoke: DoInvoke(Data);//調用請求
      asGetID: DoGetIDsOfNames(Data);
      asCreateObject: DoCreateObject(Data);
      asFreeObject: DoFreeObject(Data);
      asGetServers: DoGetServerList(Data);
      asGetAppServers: DoGetAppServerList(Data);
    else
      if not DoCustomAction(Action and asMask, Data) then
        raise EInterpreterError.CreateResFmt(@SInvalidAction, [Action and asMask]);
    end;
  except
    on E: Exception do
    begin
      Data.Clear;
      WriteVariant(E.Message, Data);
      Data.Signature := ResultSig or asError;
      FSendDataBlock.Send(Data, False);
    end;
  end;
end;

procedure TDataBlockInterpreter.DoException(const Data: IDataBlock);
var
  VarFlags: TVarFlags;
begin
  raise Exception.Create(ReadVariant(VarFlags, Data));
end;

procedure TDataBlockInterpreter.DoGetAppServerList(const Data: IDataBlock);
var
  VList: OleVariant;
  List: TStringList;
  i: Integer;
begin
  Data.Clear;
  List := TStringList.Create;
  try
//    GetMIDASAppServerList(List, FCheckRegValue);
    if List.Count > 0 then
    begin
      VList := VarArrayCreate([0, List.Count - 1], varOleStr);
      for i := 0 to List.Count - 1 do
        VList[i] := List[i];
    end else
      VList := NULL;
  finally
    List.Free;
  end;
  WriteVariant(VList, Data);
  Data.Signature := ResultSig or asGetAppServers;
  FSendDataBlock.Send(Data, False);
end;

procedure TDataBlockInterpreter.DoGetServerList(const Data: IDataBlock);
var
  VList: OleVariant;
  List: TStringList;
  i: Integer;
begin
  Data.Clear;
  List := TStringList.Create;
  try
    GetDataBrokerList(List, FCheckRegValue);
    if List.Count > 0 then
    begin
      VList := VarArrayCreate([0, List.Count - 1], varOleStr);
      for i := 0 to List.Count - 1 do
        VList[i] := List[i];
    end else
      VList := NULL;
  finally
    List.Free;
  end;
  WriteVariant(VList, Data);
  Data.Signature := ResultSig or asGetServers;
  FSendDataBlock.Send(Data, False);
end;

procedure TDataBlockInterpreter.DoCreateObject(const Data: IDataBlock);
var
  V: OleVariant;
  VarFlags: TVarFlags;
  I: Integer;
begin
  V := CreateObject(ReadVariant(VarFlags, Data));
  Data.Clear;
  I := TVarData(V).VType;
  if (I and varTypeMask) = varInteger then
  begin
    I := varDispatch;
    Data.Write(I, SizeOf(Integer));
    I := V;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲日本在线看| 免费久久精品视频| 日韩欧美一级二级| caoporn国产一区二区| 久久精品国产免费看久久精品| 最新国产精品久久精品| 精品裸体舞一区二区三区| 在线观看成人免费视频| 成人av免费在线| 国产最新精品精品你懂的| 偷拍日韩校园综合在线| 亚洲久草在线视频| 国产精品高潮呻吟久久| 亚洲精品一区在线观看| 91精品国产综合久久婷婷香蕉| 91香蕉视频黄| 成人爱爱电影网址| 国产一区二区影院| 蜜臀91精品一区二区三区| 午夜影院在线观看欧美| 亚洲韩国一区二区三区| 亚洲激情自拍偷拍| 亚洲欧洲日本在线| 国产精品精品国产色婷婷| 国产亚洲欧美日韩在线一区| 亚洲精品乱码久久久久久日本蜜臀| 久久亚洲二区三区| 欧美一级生活片| 4hu四虎永久在线影院成人| 欧美手机在线视频| 欧洲精品一区二区三区在线观看| 色综合婷婷久久| 91视视频在线观看入口直接观看www | 中文字幕一区二区三区av| 国产亚洲va综合人人澡精品| 久久久久久久久一| 国产欧美一区二区三区在线看蜜臀| 精品国产乱码久久久久久1区2区| 日韩精品一区二区三区在线观看| 91精品国产一区二区三区香蕉| 欧美精品精品一区| 欧美一级二级三级乱码| 日韩久久免费av| 久久日韩精品一区二区五区| 久久久精品免费网站| 国产欧美一区二区精品秋霞影院 | 日日夜夜精品视频天天综合网| 一个色妞综合视频在线观看| 亚洲已满18点击进入久久| 亚洲综合在线第一页| 亚洲国产精品久久久男人的天堂| 午夜伦欧美伦电影理论片| 日本成人在线不卡视频| 国模套图日韩精品一区二区| 国产一区二区三区精品欧美日韩一区二区三区 | 婷婷久久综合九色综合伊人色| 亚洲v日本v欧美v久久精品| 日韩专区欧美专区| 精品在线观看免费| 处破女av一区二区| 一本色道久久综合精品竹菊| 欧美做爰猛烈大尺度电影无法无天| 欧美日韩精品综合在线| 日韩欧美在线网站| 国产亚洲美州欧州综合国| 日韩美女久久久| 亚洲va天堂va国产va久| 国模少妇一区二区三区| 99精品桃花视频在线观看| 欧美日韩视频在线第一区| 在线播放中文一区| 国产亚洲一区二区三区| 一区二区三区免费看视频| 日韩不卡一区二区三区| 丁香激情综合国产| 欧美中文字幕一二三区视频| 欧美电视剧免费全集观看| 国产精品免费视频观看| 亚洲成人777| 国产福利一区二区三区| 欧美午夜精品一区二区蜜桃 | 日韩欧美高清一区| 国产精品精品国产色婷婷| 丝袜亚洲另类欧美综合| 国产精品一线二线三线精华| 色又黄又爽网站www久久| 日韩欧美色综合网站| 亚洲欧美偷拍卡通变态| 免费一级欧美片在线观看| 成人国产精品免费| 日韩免费在线观看| 亚洲精品网站在线观看| 国模冰冰炮一区二区| 欧美三级视频在线| 国产精品嫩草99a| 精品一区二区综合| 欧美日韩一区二区三区免费看| 国产喷白浆一区二区三区| 日本在线播放一区二区三区| 91亚洲男人天堂| 久久久久久久久久久99999| 日韩精品国产欧美| 色网综合在线观看| 国产情人综合久久777777| 久久电影网站中文字幕| 欧美系列在线观看| 亚洲人一二三区| 国产成人精品免费看| 日韩女优视频免费观看| 肉丝袜脚交视频一区二区| 在线亚洲欧美专区二区| 国产精品伦理在线| 国产一区二区福利| 欧美电影免费提供在线观看| 亚洲综合男人的天堂| 99精品黄色片免费大全| 欧美—级在线免费片| 国产剧情av麻豆香蕉精品| 亚洲一区二区三区四区中文字幕| av男人天堂一区| 国产精品入口麻豆九色| 成人性生交大合| 国产喷白浆一区二区三区| 国产精品亚洲专一区二区三区| 日韩免费看网站| 日本中文字幕不卡| 日韩一区二区电影| 美女网站色91| 日韩视频一区二区在线观看| 日本不卡123| 日韩欧美综合一区| 国内外成人在线| 精品国产乱子伦一区| 狠狠色狠狠色合久久伊人| 久久婷婷一区二区三区| 狠狠色2019综合网| 久久久99精品久久| 成人永久aaa| 亚洲免费高清视频在线| 欧洲视频一区二区| 日韩av午夜在线观看| 欧美一区二区三区男人的天堂| 蜜桃av一区二区| 久久夜色精品一区| 国产999精品久久久久久绿帽| 国产精品免费丝袜| 欧美在线高清视频| 午夜电影网亚洲视频| 欧美一区二区久久| 国产精品综合二区| 亚洲婷婷综合久久一本伊一区| 91一区二区三区在线观看| 亚洲成人一区二区| 日韩美女视频一区二区在线观看| 国产在线乱码一区二区三区| 国产日韩亚洲欧美综合| 99精品久久99久久久久| 午夜免费欧美电影| 久久综合网色—综合色88| av午夜一区麻豆| 日韩精品乱码av一区二区| 亚洲精品一区二区在线观看| gogogo免费视频观看亚洲一| 亚洲成人一区在线| 久久欧美一区二区| 在线国产电影不卡| 麻豆国产欧美一区二区三区| 中文av一区二区| 欧美日韩国产成人在线免费| 麻豆一区二区在线| 亚洲视频资源在线| 日韩一级黄色大片| 91麻豆自制传媒国产之光| 日本美女一区二区三区| 国产精品久久久久永久免费观看| 欧美日韩一卡二卡三卡| 国内精品视频一区二区三区八戒| 亚洲欧美另类小说视频| 日韩天堂在线观看| 日本韩国精品一区二区在线观看| 韩国三级在线一区| 亚洲成人免费视| 国产日韩欧美一区二区三区综合| 欧美亚洲国产一区在线观看网站| 韩国女主播成人在线| 一区二区三区在线免费| 国产色综合一区| 欧美一区二区三区在线观看视频| 成人免费毛片app| 久久精品国产精品亚洲综合| 亚洲另类色综合网站| 国产日韩成人精品| 日韩视频在线一区二区| 欧美色图一区二区三区| 成人午夜精品在线| 国产一区视频导航| 日本一区中文字幕| 亚洲综合自拍偷拍| 欧美国产日韩在线观看| 久久综合狠狠综合久久综合88 |