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

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

?? sconnect.pas

?? 在Midas數(shù)據(jù)庫編程中
?? PAS
?? 第 1 頁 / 共 5 頁
字號(hào):
          for I := 0 to DimCount - 1 do
            Indices[I] := LoDim[I];
          while True do
          begin
            V := ReadVariant(Flags, Data);
            if VType and varTypeMask = varVariant then
              OleCheck(SafeArrayPutElement(LSafeArray, Indices^, V)) else
              OleCheck(SafeArrayPutElement(LSafeArray, Indices^, TVarData(V).VPointer^));
            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;

procedure TDataBlockInterpreter.WriteArray(const Value: OleVariant;
  const Data: IDataBlock);
var
  LVarData: TVarData;
  VType: Integer;
  VSize, i, DimCount, ElemSize: Integer;
  LSafeArray: PSafeArray;
  LoDim, HiDim, Indices: PIntArray;
  V: OleVariant;
  P: Pointer;
begin
  LVarData := FindVarData(Value)^;
  VType := LVarData.VType;
  LSafeArray := PSafeArray(LVarData.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 VType and varArray <> 0 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;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲综合久久| 91在线高清观看| 一区二区三区精品| 国产精品进线69影院| 久久久精品中文字幕麻豆发布| 欧美一区二区三区免费大片| 欧美日韩日日骚| 8x8x8国产精品| 欧美视频完全免费看| 欧美区视频在线观看| 欧美一区二区三区在线看| 91麻豆精品国产91久久久 | 99国产麻豆精品| 成人福利视频在线| 91免费视频大全| 欧美日韩精品一区二区三区蜜桃 | 国产在线不卡视频| 国产成人av一区二区三区在线观看| 国产不卡高清在线观看视频| 91美女在线观看| 欧洲一区在线观看| 日韩欧美国产一区二区三区 | 亚洲女性喷水在线观看一区| 亚洲国产精品嫩草影院| 奇米一区二区三区| 国产福利一区在线| 91免费看`日韩一区二区| 欧美日韩国产系列| 久久综合九色综合欧美就去吻| 国产精品久久久久久久久免费相片 | 亚洲成人免费看| 国精产品一区一区三区mba视频| 高清免费成人av| 欧美三级日韩在线| 久久香蕉国产线看观看99| 日韩毛片高清在线播放| 七七婷婷婷婷精品国产| 99久久综合狠狠综合久久| 777a∨成人精品桃花网| 18成人在线视频| 久久99精品一区二区三区 | 日本久久精品电影| 久久综合一区二区| 一区二区三区中文字幕电影| 美女高潮久久久| 成人99免费视频| 欧美xxxx老人做受| 亚洲另类春色校园小说| 国产一区二区三区四区在线观看| 色狠狠一区二区| 亚洲国产精品av| 老司机精品视频线观看86| 91女人视频在线观看| 国产亚洲精品aa| 精品一区二区三区久久久| 欧美女孩性生活视频| 亚洲色图欧洲色图| 成人激情小说网站| 久久久久久黄色| 精品一区二区三区日韩| 欧美猛男超大videosgay| 亚洲欧美视频在线观看| 懂色av噜噜一区二区三区av| 欧美精品一区二区蜜臀亚洲| 日本欧美肥老太交大片| 欧美久久久久久久久中文字幕| 亚洲毛片av在线| 97久久人人超碰| 国产精品久久久久久久久久免费看 | 亚洲品质自拍视频网站| 国产成人在线视频网站| 久久久久久久久久久久久女国产乱| 青青草成人在线观看| 欧美日韩国产精选| 亚洲v中文字幕| 8v天堂国产在线一区二区| 性感美女久久精品| 制服丝袜亚洲播放| 奇米色一区二区三区四区| 日韩精品一区二区三区中文精品| 全国精品久久少妇| 精品国产一区二区三区不卡 | 亚洲国产精品久久一线不卡| 在线精品观看国产| 日韩美女久久久| 欧美性生活一区| 日韩av在线播放中文字幕| 日韩一区二区免费在线观看| 裸体在线国模精品偷拍| 久久午夜免费电影| www.日韩精品| 亚洲妇女屁股眼交7| 日韩精品综合一本久道在线视频| 国产一区二区在线免费观看| 国产精品三级电影| 欧美做爰猛烈大尺度电影无法无天| 亚洲超碰精品一区二区| 日韩欧美中文字幕公布| 国产1区2区3区精品美女| 亚洲精品一二三区| 日韩一区二区三区四区| 国产高清不卡一区| 亚洲国产成人av好男人在线观看| 日韩欧美中文字幕精品| 99久久er热在这里只有精品66| 亚洲一区二区在线免费观看视频| 日韩女优毛片在线| av中文字幕不卡| 日本sm残虐另类| 综合激情成人伊人| 欧美一级高清片在线观看| 成人免费视频视频在线观看免费| 亚洲国产视频一区二区| 久久这里只有精品视频网| 在线观看不卡一区| 国产真实乱对白精彩久久| 亚洲免费观看高清完整版在线观看熊 | 欧美国产激情二区三区| 欧美中文字幕亚洲一区二区va在线 | 91香蕉视频黄| 欧美a级一区二区| 成人免费视频在线观看| 精品久久五月天| 欧美性xxxxx极品少妇| 国产成人综合在线播放| 秋霞国产午夜精品免费视频| 亚洲天堂网中文字| 国产午夜精品福利| 欧美日韩免费观看一区三区| a在线播放不卡| 国产高清精品久久久久| 麻豆久久久久久久| 午夜久久电影网| 亚洲欧美日本韩国| 国产欧美日韩精品a在线观看| 欧美一卡二卡三卡| 欧美日韩国产综合久久| 日本精品裸体写真集在线观看| 岛国av在线一区| 懂色av中文字幕一区二区三区| 久久99国产精品尤物| 日韩不卡手机在线v区| 亚洲影视在线播放| 樱桃视频在线观看一区| 亚洲色图欧美在线| 国产精品理伦片| 国产精品久久久久久久久久久免费看 | 亚洲国产精品精华液网站| 亚洲美女屁股眼交3| 中文字幕色av一区二区三区| 国产精品久久久久久一区二区三区 | 一区二区理论电影在线观看| 国产精品美女久久福利网站| 国产日产欧产精品推荐色 | 成人精品在线视频观看| 国产91对白在线观看九色| 国内不卡的二区三区中文字幕| 久久精品国产成人一区二区三区 | 国产亚洲一区二区三区| 精品福利一二区| 337p粉嫩大胆噜噜噜噜噜91av| 欧美xxxxx牲另类人与| 日韩欧美美女一区二区三区| 日韩一区二区三区四区| 久久中文娱乐网| 中文字幕不卡在线观看| 亚洲摸摸操操av| 午夜电影一区二区| 久久国产麻豆精品| 国产高清精品在线| 99国产精品国产精品毛片| 欧洲精品在线观看| 日韩欧美一区二区三区在线| 久久香蕉国产线看观看99| 国产精品热久久久久夜色精品三区 | 欧美成人国产一区二区| 久久夜色精品一区| 亚洲欧美在线观看| 亚洲一区免费观看| 国产在线不卡一区| 色先锋aa成人| 欧美成人伊人久久综合网| 国产精品欧美一区喷水| 香蕉av福利精品导航| 国产一区二区免费在线| 91黄色免费观看| 中文字幕在线观看不卡视频| 一区二区三区小说| 麻豆精品一区二区三区| 99久久国产综合色|国产精品| 在线不卡欧美精品一区二区三区| 国产喂奶挤奶一区二区三区 | 欧美日韩一级大片网址| 久久久国产精品午夜一区ai换脸| 有坂深雪av一区二区精品| 韩日av一区二区| 欧美日韩和欧美的一区二区| 国产精品久久久久毛片软件| 蜜臀va亚洲va欧美va天堂| 色婷婷狠狠综合|