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

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

?? sconnectex.pas

?? 一般的數據庫管理系統 uses Classes, SConnectEx, TltConst, ExtCtrls, MMSystem, Types, windows, TltLogic , Sy
?? PAS
?? 第 1 頁 / 共 5 頁
字號:
    Data.Write(I, SizeOf(Integer));
  end else
    WriteVariant(V, Data);
  Data.Signature := ResultSig or asCreateObject;
  FSendDataBlock.Send(Data, False);
end;

procedure TDataBlockInterpreter.DoFreeObject(const Data: IDataBlock);
var
  VarFlags: TVarFlags;
begin
  try
    ReleaseObject(ReadVariant(VarFlags, Data));
  except
    { Don't return any exceptions }
  end;
end;

procedure TDataBlockInterpreter.DoGetIDsOfNames(const Data: IDataBlock);
var
  ObjID, RetVal, DispID: Integer;
  Disp: IDispatch;
  W: WideString;
  VarFlags: TVarFlags;
begin
  ObjID := ReadVariant(VarFlags, Data);
  Disp := LockObject(ObjID);
  try
    W := ReadVariant(VarFlags, Data);
    Data.Clear;
    RetVal := Disp.GetIDsOfNames(GUID_NULL, @W, 1, 0, @DispID);
  finally
    UnlockObject(ObjID, Disp);
  end;
  WriteVariant(RetVal, Data);
  if RetVal = S_OK then
    WriteVariant(DispID, Data);
  Data.Signature := ResultSig or asGetID;
  FSendDataBlock.Send(Data, False);
end;

procedure TDataBlockInterpreter.DoInvoke(const Data: IDataBlock);
var
  ExcepInfo: TExcepInfo;
  DispParams: TDispParams;
  ObjID, DispID, Flags, i: Integer;
  RetVal: HRESULT;
  ExpectResult: Boolean;
  VarFlags: TVarFlags;
  Disp: IDispatch;
  VarList: PVariantArray;
  V: OleVariant;
begin  //
  VarList := nil;  //參數列表
  FillChar(ExcepInfo, SizeOf(ExcepInfo), 0);//異常信息
  FillChar(DispParams, SizeOf(DispParams), 0);//參數
  ObjID := ReadVariant(VarFlags, Data);  //讀取對象ID
  Disp := LockObject(ObjID); // 找到對象
  try
    DispID := ReadVariant(VarFlags, Data);//讀取調度ID
    Flags := ReadVariant(VarFlags, Data);//讀取數據標識
    ExpectResult := ReadVariant(VarFlags, Data);//讀取異常標識
    DispParams.cArgs := ReadVariant(VarFlags, Data);//讀取調度參數
    DispParams.cNamedArgs := ReadVariant(VarFlags, Data);//讀取調度參數名稱
    try
      DispParams.rgdispidNamedArgs := nil;//
      if DispParams.cNamedArgs > 0 then //名字參數
      begin
        GetMem(DispParams.rgdispidNamedArgs, DispParams.cNamedArgs * SizeOf(Integer));
        for i := 0 to DispParams.cNamedArgs - 1 do
          DispParams.rgdispidNamedArgs[i] := ReadVariant(VarFlags, Data);
      end;
      if DispParams.cArgs > 0 then  //參數個數
      begin
        GetMem(DispParams.rgvarg, DispParams.cArgs * SizeOf(TVariantArg));//分配參數空間
        GetMem(VarList, DispParams.cArgs * SizeOf(OleVariant));//分配參數空間
        Initialize(VarList^, DispParams.cArgs); //分配列表空間
        for i := 0 to DispParams.cArgs - 1 do
        begin
          VarList[i] := ReadVariant(VarFlags, Data); //依次讀取參數
          if vfByRef in VarFlags then //類型參考
          begin
            if vfVariant in VarFlags then //如果是變體
            begin
              DispParams.rgvarg[i].vt := varVariant or varByRef;
              TVarData(DispParams.rgvarg[i]).VPointer := @VarList[i];
            end else
            begin
              DispParams.rgvarg[i].vt := VarType(VarList[i]) or varByRef; //如果是具體類型
              TVarData(DispParams.rgvarg[i]).VPointer := GetVariantPointer(VarList[i]);//存正確指針
            end;
          end else
            DispParams.rgvarg[i] := TVariantArg(VarList[i]);//無類型
        end;
      end;
      Data.Clear; //清空數據包
      RetVal := Disp.Invoke(DispID, GUID_NULL, 0, Flags, DispParams, @V, @ExcepInfo, nil);//AuotObject調用
      WriteVariant(RetVal, Data);//寫入返回結果
      if RetVal = DISP_E_EXCEPTION then //如果調用異常
      begin
        WriteVariant(ExcepInfo.scode, Data); //返回異常碼
        WriteVariant(ExcepInfo.bstrDescription, Data);//返回異常描述
      end;
      if DispParams.rgvarg <> nil then //如果休要返回參數
      begin
        for i := 0 to DispParams.cArgs - 1 do //填寫返回參數
          if DispParams.rgvarg[i].vt and varByRef = varByRef then
            WriteVariant(OleVariant(DispParams.rgvarg[i]), Data);
      end;
      if ExpectResult then WriteVariant(V, Data); //如果有返回值,寫返回值
      Data.Signature := ResultSig or asInvoke;//標識為調用返回
      FSendDataBlock.Send(Data, False);//發送數據包
    finally
      if DispParams.rgdispidNamedArgs <> nil then //參數名稱
        FreeMem(DispParams.rgdispidNamedArgs);    //釋放參數名稱
      if VarList <> nil then                      //釋放值表
      begin
        Finalize(VarList^, DispParams.cArgs);
        FreeMem(VarList);
      end;
      if DispParams.rgvarg <> nil then
        FreeMem(DispParams.rgvarg);
    end;
  finally
    UnlockObject(ObjID, Disp);
  end;
end;

function TDataBlockInterpreter.DoCustomAction(Action: Integer;
  const Data: IDataBlock): Boolean;
begin
  Result := False;
end;

{ TDataDispatch }

constructor TDataDispatch.Create(Interpreter: TCustomDataBlockInterpreter; DispatchIndex: Integer);
begin
  inherited Create;
  FDispatchIndex := DispatchIndex;
  FInterpreter := Interpreter;
  Interpreter.AddDispatch(Self);
end;

destructor TDataDispatch.Destroy;
begin
  if Assigned(FInterpreter) then
  begin
    FInterpreter.CallFreeObject(FDispatchIndex);
    FInterpreter.RemoveDispatch(Self);
  end;
  inherited Destroy;
end;

{ TDataDispatch.IDispatch }

function TDataDispatch.GetTypeInfoCount(out Count: Integer): HResult; stdcall;
begin
  Count := 0;
  Result := S_OK;
end;

function TDataDispatch.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function TDataDispatch.GetIDsOfNames(const IID: TGUID; Names: Pointer;
  NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
begin
  Result := FInterpreter.CallGetIDsOfNames(FDispatchIndex, IID, Names, NameCount,
    LocaleID, DispIDs);
end;

function TDataDispatch.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
begin
  Result := FInterpreter.CallInvoke(FDispatchIndex, DispID, IID, LocaleID, Flags,
    Params, VarResult, ExcepInfo, ArgErr);
end;


{ TTransportThread }

constructor TTransportThread.Create(AHandle: THandle; Transport: ITransport);
begin
  FParentHandle := AHandle;
  FTransport := Transport;
  FreeOnTerminate := True;
  FSemaphore := CreateSemaphore(nil, 0, 1, nil);
  inherited Create(False);
end;

destructor TTransportThread.Destroy;
begin
  CloseHandle(FSemaphore);
  inherited Destroy;
end;

procedure TTransportThread.Execute;

  procedure SynchronizeException;
  var
    SendException: TObject;
  begin
    SendException := AcquireExceptionObject;
    if Assigned(FTransport) and (SendException is ESocketConnectionError) then
      FTransport.Connected := False;
    PostMessage(FParentHandle, THREAD_EXCEPTION, 0, Integer(Pointer(SendException)));
  end;

var
  msg: TMsg;
  Data: IDataBlock;
  Event: THandle;
  Context: Integer;
begin
  CoInitialize(nil);
  try
    PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);
    ReleaseSemaphore(FSemaphore, 1, nil);
    try
      FTransport.Connected := True;
      try
        Event := FTransport.GetWaitEvent;
        while not Terminated and FTransport.Connected do
        try
          case MsgWaitForMultipleObjects(1, Event, False, INFINITE, QS_ALLINPUT) of
            WAIT_OBJECT_0:
            begin
              WSAResetEvent(Event);
              Data := FTransport.Receive(False, 0);
              if Assigned(Data) then
              begin
                Data._AddRef;
                PostMessage(FParentHandle, THREAD_RECEIVEDSTREAM, 0, Integer(Pointer(Data)));
                Data := nil;
              end;
            end;
            WAIT_OBJECT_0 + 1:
            begin
              while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do
              begin
                if (msg.hwnd = 0) then
                  case msg.message of
                    THREAD_SENDSTREAM:
                    begin
                      Data := IDataBlock(msg.lParam);
                      Data._Release;
                      Context := FTransport.Send(Data);
                      if msg.wParam = 1 then
                      begin
                        Data := FTransport.Receive(True, Context);
                        Data._AddRef;
                        PostMessage(FParentHandle, THREAD_RECEIVEDSTREAM, 0, Integer(Pointer(Data)));
                        Data := nil;
                      end else
                        PostMessage(FParentHandle, THREAD_SENDNOTIFY, 0, 0);
                    end;
                    THREAD_REPLACETRANSPORT:
                    begin
                      FTransport := ITransport(msg.lParam);
                      FTransport._Release;
                    end;
                  else
                    DispatchMessage(msg);
                  end
                else
                  DispatchMessage(msg);
              end;
            end;
          end;
        except
          SynchronizeException;
        end;
      finally
        Data := nil;
        FTransport.Connected := False;
      end;
    except
      SynchronizeException;
    end;
  finally
    FTransport := nil;
    CoUninitialize();
  end;
end;

{ TStreamedConnection }

constructor TStreamedConnection.Create(AOwner: TComponent);
var
  Obj: ISendDataBlock;
begin
  inherited Create(AOwner);
  GetInterface(ISendDataBlock, Obj);
//  FInterpreter := TDataBlockInterpreter.Create(Self, SSockets);
  FSupportCallbacks := True;
end;
procedure TStreamedConnection.SetConnected(Value: Boolean);
begin
  if (csReading in ComponentState) and Value then
    FStreamedConnected := True else
  begin
    if Value = GetConnected then Exit;
    if Value then
    begin
      if Assigned(BeforeConnect) then BeforeConnect(Self);
      DoConnect;
//      SendConnectEvent(True);
      if Assigned(AfterConnect) then AfterConnect(Self);
    end else
    begin
      if Assigned(BeforeDisconnect) then BeforeDisconnect(Self);
//      SendConnectEvent(False);
      DoDisconnect;
      if Assigned(AfterDisconnect) then AfterDisconnect(Self);
    end;
  end;
end;


destructor TStreamedConnection.Destroy;
begin
  SetConnected(False);
  FInterpreter.Free;
  if FHandle <> 0 then DeallocateHWnd(FHandle);
  if Assigned(FTransport) then FTransport.OnTerminate := nil;
  FTransIntf := nil;
  inherited Destroy;
end;

function TStreamedConnection.GetInterceptGUID: string;
begin
  if (FInterceptGUID.D1 <> 0) or (FInterceptGUID.D2 <> 0) or (FInterceptGUID.D3 <> 0) then
    Result := GUIDToString(FInterceptGUID) else
    Result := '';
end;

procedure TStreamedConnection.SetInterceptGUID(const Value: string);
var
  InterceptName: PWideChar;
begin
  if not (csLoading in ComponentState) then
    SetConnected(False);
  if Value = '' then
    FillChar(FInterceptGUID, SizeOf(FInterceptGUID), 0)
  else
  begin
    FInterceptGUID := StringToGUID(Value);
    if ProgIDFromCLSID(FInterceptGUID, InterceptName) = 0 then
    begin
      FInterceptName := InterceptName;
      CoTaskMemFree(InterceptName);
    end;
  end;
end;

procedure TStreamedConnection.SetInterceptName(const Value: string);
begin
  if Value <> FInterceptName then
  begin
    if not (csLoading in ComponentState) then
    begin
      SetConnected(False);
      if CLSIDFromProgID(PWideChar(WideString(Value)), FInterceptGUID) <> 0 then
        FillChar(FInterceptGUID, SizeOf(FInterceptGUID), 0);
    end;
    FInterceptName := Value;
  end;
end;

procedure TStreamedConnection.SetSupportCallbacks(Value: Boolean);
begin
  if Connected then Connected := False;
  FSupportCallbacks := Value;
end;

procedure TStreamedConnection.InternalOpen;
begin
  if FSupportCallbacks then
  begin
    FTransport := TTransportThread.Create(Handle, CreateTransport);
    FTransport.OnTerminate := TransportTerminated;
    WaitForSingleObject(FTransport.Semaphore, INFINITE);
  end else
  begin
    FTransIntf := CreateTransport;
    FTransIntf.SetConnected(True);
  end;
end;

procedure TStreamedConnection.InternalClose;
begin
  if Assigned(FTransport) then
  begin
    FTransport.OnTerminate := nil;
    FTransport.Terminate;
    PostThreadMessage(FTransport.ThreadID, WM_USER, 0, 0);
    WaitForSingleObject(FTransport.Handle, 180000);
    FTransport := nil;
  end else
  if Assigned(FTransIntf) then
  begin
    FTransIntf.Connected := False;
    FTransIntf := nil;
  end;
end;

function TStreamedConnection.GetInterceptorList: OleVariant;
var
  List: TStringList;
  i: Integer;
begin
  Result := NULL;
  List := TStringList.Create;
  try
    GetPacketInterceptorList(List);
    if List.Count > 0 then
    begin
      Result := VarArrayCreate([0, List.Count - 1], varOleStr);
      for i := 0 to List.Count - 1 do
        Result[i] := List[i];
    end;
  finally

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美激情在线一区二区| 九九久久精品视频| 美女精品一区二区| av高清久久久| 日韩女优毛片在线| 亚洲一卡二卡三卡四卡五卡| 国产精品99久久久久久宅男| 欧美高清dvd| 一区二区三区四区激情| 国产91精品精华液一区二区三区| 国产一区二区美女| 亚洲国产精品尤物yw在线观看| 国产在线不卡一区| 777午夜精品免费视频| 亚洲精品免费在线| 一本色道久久综合亚洲91| 日本一区二区三区在线观看| 激情六月婷婷久久| 日韩视频一区二区三区| 五月天精品一区二区三区| 色欧美88888久久久久久影院| 久久久久国产精品人| 黑人巨大精品欧美黑白配亚洲| 91精品国产色综合久久| 日日夜夜精品视频天天综合网| 欧美色图一区二区三区| 亚洲在线视频一区| 在线观看一区二区精品视频| 一区二区三区在线视频免费观看| 成人h动漫精品| 国产精品麻豆网站| 精品国产精品一区二区夜夜嗨| 欧美日韩精品一区二区三区四区 | 日韩在线一二三区| 91看片淫黄大片一级在线观看| 国产日韩一级二级三级| 国产不卡免费视频| 中文字幕一区二区日韩精品绯色| 成人精品视频一区二区三区尤物| 国产精品美女久久久久久久| av亚洲产国偷v产偷v自拍| 亚洲理论在线观看| 欧美日韩欧美一区二区| 肉丝袜脚交视频一区二区| 日韩一区二区三区视频在线| 国产综合久久久久影院| 国产精品人人做人人爽人人添| 99视频精品免费视频| 一片黄亚洲嫩模| 4438成人网| 懂色av一区二区三区免费观看| 国产精品久久久久影视| 日本韩国视频一区二区| 天天综合网天天综合色| 精品国产成人系列| av中文字幕一区| 午夜精品一区二区三区免费视频| 欧美一二三在线| 高清视频一区二区| 亚洲综合在线观看视频| 欧美成人国产一区二区| 91蜜桃传媒精品久久久一区二区| 亚洲国产成人tv| 久久久www成人免费无遮挡大片| 91麻豆国产自产在线观看| 天天操天天干天天综合网| 国产欧美日韩综合| 欧美日韩国产小视频在线观看| 国产美女精品在线| 亚洲在线视频一区| 国产亚洲精品7777| 欧美日韩国产首页| 不卡av在线免费观看| 青青青伊人色综合久久| 亚洲天堂av老司机| 精品日韩一区二区| 欧美视频中文一区二区三区在线观看| 成人的网站免费观看| 毛片不卡一区二区| 亚洲在线视频一区| 国产精品沙发午睡系列990531| 5566中文字幕一区二区电影| 97精品久久久午夜一区二区三区 | 亚洲三级电影网站| 精品国产一区二区三区忘忧草| 94色蜜桃网一区二区三区| 狠狠色丁香久久婷婷综合丁香| 亚洲免费观看高清完整版在线| 欧美大片在线观看一区| 欧美日韩国产影片| 99国产精品久久久久久久久久 | 久久久噜噜噜久久中文字幕色伊伊| 97se亚洲国产综合自在线不卡| 国产在线精品视频| 蜜臀av性久久久久av蜜臀妖精| 樱桃国产成人精品视频| 国产精品天天看| 国产欧美一区二区三区在线老狼| 日韩精品一区二区三区四区| 欧美日本在线播放| 91极品视觉盛宴| 色综合天天天天做夜夜夜夜做| 国产91在线观看| 国产精品一区一区三区| 美女久久久精品| 久久精品99国产精品| 日韩二区在线观看| 亚洲地区一二三色| 亚洲成人免费在线| 午夜精品久久久久久久99水蜜桃| 亚洲欧美aⅴ...| 亚洲免费高清视频在线| 亚洲精品菠萝久久久久久久| 亚洲美女淫视频| 亚洲一区二区三区在线看| 一区二区三区中文字幕| 亚洲国产精品久久不卡毛片| 一区二区三区色| 五月天国产精品| 美女在线视频一区| 经典一区二区三区| 成人一区在线看| 99re免费视频精品全部| 色一情一乱一乱一91av| 欧美亚洲一区三区| 日韩欧美国产高清| 国产亚洲综合av| 亚洲欧洲av另类| 一区二区三区四区不卡视频| 日韩黄色免费电影| 久久国产精品99精品国产 | 亚洲色图在线播放| 亚洲精品国产第一综合99久久| 亚洲一二三区在线观看| 日本最新不卡在线| 大胆欧美人体老妇| 色视频一区二区| 日韩一级二级三级精品视频| 国产亚洲一区二区在线观看| 亚洲免费观看视频| 老司机免费视频一区二区| 精品视频在线视频| 亚洲精品一区二区精华| 亚洲视频一区二区在线| 首页亚洲欧美制服丝腿| 国产高清精品在线| 色网站国产精品| 日韩欧美国产综合一区| 亚洲色图20p| 麻豆91精品视频| 99re这里只有精品视频首页| 67194成人在线观看| 国产精品毛片久久久久久久| 日韩高清不卡一区二区三区| 国产成人综合亚洲网站| 欧美日韩视频专区在线播放| 久久久一区二区三区| 首页国产欧美日韩丝袜| 91在线视频网址| 欧美videofree性高清杂交| 亚洲精品高清视频在线观看| 国产九色精品成人porny| 一本一本久久a久久精品综合麻豆| 日韩一级大片在线| 亚洲国产日产av| 99精品久久只有精品| 久久婷婷国产综合精品青草| 亚洲成人免费看| 91丨九色丨蝌蚪丨老版| 国产日产欧美一区二区视频| 日韩国产欧美在线播放| 91理论电影在线观看| 国产性天天综合网| 久久se精品一区二区| 欧美另类高清zo欧美| 亚洲日穴在线视频| 成人h动漫精品| 欧美极品少妇xxxxⅹ高跟鞋| 免费的成人av| 欧美一区二区视频免费观看| 一区二区三区中文在线观看| www.亚洲色图| 国产精品拍天天在线| 国产黑丝在线一区二区三区| 精品久久久久99| 久久99热这里只有精品| 91精品国产综合久久精品性色 | 欧美另类z0zxhd电影| 亚洲三级在线免费观看| 成人三级在线视频| 亚洲国产精品v| 成人综合婷婷国产精品久久免费| 日韩欧美激情一区| 精品一区二区国语对白| 日韩午夜在线观看| 久久精品噜噜噜成人88aⅴ| 91精品国产91热久久久做人人| 日韩精品一区第一页| 67194成人在线观看| 久久成人免费电影|