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

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

?? dxplay.pas

?? delphi中很有名的delphiX組件。傳奇2客戶端源代碼也是用這個組件。
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
  try
    FillChar(lpAddress^, dwAddressSize, 0);

    if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, lpAddress^, dwAddressSize)<>0 then
      raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);

    {  DirectPlay initialization  }
    if CoCreateInstance(CLSID_DirectPlay, nil, CLSCTX_INPROC_SERVER, IID_IDirectPlay4A, DPlay)<>0 then
      raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
    try
      {  DirectPlay address initialization  }
      if DPlay.InitializeConnection(lpAddress, 0)<>0 then
        raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
    except
      DPlay := nil;
      raise;
    end;
  finally
    FreeMem(lpAddress);
  end;
end;

procedure TCustomDXPlay.ClearSessionList;
var
  i: Integer;
begin
  FReadSessioned := False;
  for i:=0 to FSessions.Count-1 do
    Dispose(PGUID(FSessions.Objects[i]));
  FSessions.Clear;
end;

procedure TCustomDXPlay.Open;
var
  PlayerName: string;
begin
  Close;
  try
    if not OpenDPlayWithLobby(PlayerName) then
    begin
      if not OpenDPlayWithoutLobby(PlayerName) then
        Abort;
    end;

    Open_(PlayerName);
  except
    Close;
    raise;
  end;
end;

procedure TCustomDXPlay.Open2(NewSession: Boolean; const SessionName, PlayerName: string);
begin
  if not OpenDPlayWithoutLobby2(NewSession, ProviderName, SessionName, PlayerName) then
    Abort;

  Open_(PlayerName);
end;

procedure TCustomDXPlay.Open_(NameS: string);

  function EnumPlayersCallback2(TDPID: TDPID; dwPlayerType: DWORD;
    const lpName: TDPName; dwFlags: DWORD; lpContext: Pointer): BOOL;
    stdcall;
  var                   
    Player: TDXPlayPlayer;
  begin
    Player := TDXPlayPlayer.Create(TCustomDXPlay(lpContext).Players);
    Player.FID := TDPID;
    Player.FRemotePlayer := True;

    with lpName do
    begin
      if lpszShortNameA<>nil then
        Player.FName := lpszShortNameA;
    end;

    Result := True;
  end;

var
  Name2: array[0..1023] of Char;
  Name: TDPName;
begin
  if FOpened then Close;
  FOpened := True;
  try
    {  Player making  }
    StrLCopy(@Name2, PChar(NameS), SizeOf(Name2));

    Name.lpszShortNameA := @Name2;
    Name.lpszLongNameA := nil;

    FRecvEvent[0] := CreateEvent(nil, False, False, nil);

    FLocalPlayer := TDXPlayPlayer.Create(FPlayers);
    FLocalPlayer.FName := NameS;

    if FDPlay.CreatePlayer(FLocalPlayer.FID, Name, FRecvEvent[0], nil^, 0, 0)<>DP_OK then
      raise EDXPlayError.CreateFmt(SCannotOpened, [FSessionName]);

    {  Player enumeration  }
    FDPlay.EnumPlayers(PGUID(nil)^, @EnumPlayersCallback2, Self, DPENUMPLAYERS_REMOTE);

    FIsHost := FPlayers.Count=1;

    FCalledDoOpen := True; DoOpen;
    DoAddPlayer(FLocalPlayer);

    {  Thread start  }
    FRecvThread := TDXPlayRecvThread.Create(Self);
    FRecvThread.Resume;
  except
    Close;
    raise;
  end;
end;

procedure TCustomDXPlay.ChangeDPlay;
var
  caps: TDPCAPS;
begin
  FAsyncSupported := False;
  if FDPlay<>nil then
  begin
    FillChar(caps, SizeOf(caps), 0);
    caps.dwSize := SizeOf(caps);
    FDPlay.GetCaps(caps, 0);

    FAsyncSupported := caps.dwFlags and DPCAPS_ASYNCSUPPORTED<>0;
  end;
end;

function TCustomDXPlay.OpenDPlayWithLobby(out Name: string): Boolean;
var
  DPlay1: IDirectPlay2;
  Lobby: IDirectPlayLobbyA;
  dwSize: DWORD;
  ConnectionSettings: PDPLConnection;
begin
  Result := False;

  if DXDirectPlayLobbyCreateA(PGUID(nil)^, Lobby, nil, nil, 0)<>0 then
    Exit;

  if Lobby.GetConnectionSettings(0, PDPLConnection(nil)^, dwSize)<>DPERR_BUFFERTOOSMALL then
    Exit;

  GetMem(ConnectionSettings, dwSize);
  try
    if Lobby.GetConnectionSettings(0, ConnectionSettings^, dwSize)<>0 then
      Exit;

    with ConnectionSettings^.lpSessionDesc^ do
    begin
      dwFlags := DPSESSION_MIGRATEHOST or DPSESSION_KEEPALIVE or DPSESSION_DIRECTPLAYPROTOCOL;
      dwMaxPlayers := FMaxPlayers;
    end;

    if Lobby.SetConnectionSettings(0, 0, ConnectionSettings^)<>0 then
      Exit;

    if Lobby.Connect(0, DPlay1, nil)<>0 then
      Exit;
    FDPlay := DPlay1 as IDirectPlay4A;
    ChangeDPlay;

    with ConnectionSettings.lpSessionDesc^ do
    begin
      if lpszSessionNameA<>nil then
        FSessionName := lpszSessionNameA;
    end;

    with ConnectionSettings.lpPlayerName^ do
    begin
      if lpszShortNameA<>nil then
        Name := lpszShortNameA;
    end;
  finally
    FreeMem(ConnectionSettings);
  end;

  Result := True;
end;

function TCustomDXPlay.OpenDPlayWithoutLobby(out Name: string): Boolean;
var
  Form: TDelphiXDXPlayForm;
begin
  Form := TDelphiXDXPlayForm.Create(Application);
  try
    Form.DXPlay := Self;
    Form.ShowModal;

    Result := Form.Tag<>0;

    FDPlay := Form.DPlay;
    ChangeDPlay;

    Name := Form.PlayerName;
    FProviderName := Form.ProviderName;
    FSessionName := Form.SessionName;
  finally
    Form.Free;
  end;
end;

function TCustomDXPlay.OpenDPlayWithoutLobby2(const NewSession: Boolean;
  const ProviderName, SessionName, PlayerName: string): Boolean;
var
  dpDesc: TDPSessionDesc2;
  i: Integer;
  hr: HRESULT;
begin
  Result := False;

  if FDPlay=nil then
    raise EDXPlayError.Create(SDXPlayNotConnectedNow);

  if SessionName='' then
    raise EDXPlayError.Create(SDXPlaySessionNameIsNotSpecified);

  if PlayerName='' then
    raise EDXPlayError.Create(SDXPlayPlayerNameIsNotSpecified);

  if NewSession then
  begin
    {  Session connection  }
    FillChar(dpDesc, SizeOf(dpDesc), 0);
    dpDesc.dwSize := SizeOf(dpDesc);
    dpDesc.dwFlags := DPSESSION_MIGRATEHOST or DPSESSION_KEEPALIVE;
    dpDesc.lpszSessionNameA := PChar(SessionName);
    dpDesc.guidApplication := DXPlayStringToGUID(GUID);
    dpDesc.dwMaxPlayers := MaxPlayers;

    hr := FDPlay.Open(dpDesc, DPOPEN_CREATE);
    if hr=DPERR_USERCANCEL then Exit;
    if hr<>0 then
      raise EDXPlayError.CreateFmt(SDXPlaySessionCannotOpened, [FSessionName]);
  end else
  begin
    {  Session connection  }
    {  Enum session  }
    i := Sessions.IndexOf(SessionName);
    if i=-1 then raise EDXPlayError.CreateFmt(SDXPlaySessionNotFound, [SessionName]);

    FillChar(dpDesc, SizeOf(dpDesc), 0);
    dpDesc.dwSize := SizeOf(dpDesc);
    dpDesc.guidInstance := PGUID(Sessions.Objects[i])^;
    dpDesc.guidApplication := DXPlayStringToGUID(GUID);

    hr := FDPlay.Open(dpDesc, DPOPEN_JOIN);
    if hr=DPERR_USERCANCEL then Exit;
    if hr<>0 then
      raise EDXPlayError.CreateFmt(SDXPlaySessionCannotOpened, [FSessionName]);
  end;

  Result := True;

  FSessionName := SessionName;
end;

procedure TCustomDXPlay.Close;
begin
  FOpened := False;
  FReadSessioned := False;

  try
    if FCalledDoOpen then
    begin
      FCalledDoOpen := False;
      DoClose;
    end;
  finally
    if FDPlay<>nil then
    begin
      if FLocalPlayer<>nil then FDPlay.DestroyPlayer(FLocalPlayer.FID);
      FDPlay.Close;
    end;

    FProviderName := '';
    FSessionName := '';
    FAsyncSupported := False;
    
    ClearSessionList;

    FDPlay := nil;
    ChangeDPlay;

    if FInThread then
      SetEvent(FRecvEvent[1])
    else
      FRecvThread.Free;
    
    CloseHandle(FRecvEvent[0]); FRecvEvent[0] := 0;

    FPlayers.Clear;

    FLocalPlayer := nil;
  end;
end;

procedure TCustomDXPlay.SendMessage(ToID: TDPID; Data: Pointer; DataSize: Integer);
begin
  if not Opened then Exit;

  if DataSize<SizeOf(TDPMSG_GENERIC) then
    raise EDXPlayError.Create(SDXPlayMessageIllegal);

  if ToID=FLocalPlayer.ID then
  begin
    {  Message to me  }
    DoMessage(FLocalPlayer, Data, DataSize);
  end else
  if FAsync and FAsyncSupported then
    FDPlay.SendEx(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED or DPSEND_ASYNC, Data^, DataSize, 0, 0, nil, nil)
  else
    FDPlay.Send(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED, Data^, DataSize);
end;

function TCustomDXPlay.SendMessageEx(ToID: TDPID; Data: Pointer; DataSize: Integer;
  dwFlags: DWORD): DWORD;
begin
  if not Opened then Exit;

  if DataSize<SizeOf(TDPMSG_GENERIC) then
    raise EDXPlayError.Create(SDXPlayMessageIllegal);

  Result := 0;
  if ToID=FLocalPlayer.ID then
  begin
    {  帺暘埗偺儊僢僙乕僕  }
    DoMessage(FLocalPlayer, Data, DataSize);
  end else
    FDPlay.SendEx(FLocalPlayer.ID, ToID, dwFlags, Data^, DataSize,
      0, 0, nil, @Result); // 0 埲奜偼僒億乕僩偟側偄僨僶僀僗偁傞偺偱巊傢側偄
end;

procedure TCustomDXPlay.SetGUID(const Value: string);
begin
  if Value<>FGUID then
  begin
    if Value='' then
    begin
      FGUID := GUIDToString(GUID_NULL);
    end else
    begin
      FGUID := GUIDToString(DXPlayStringToGUID(Value));
    end;
  end;
end;

procedure TCustomDXPlay.SetModemSetting(Value: TDXPlayModemSetting);
begin
  FModemSetting.Assign(Value);
end;

procedure TCustomDXPlay.SetProviderName(const Value: string);
begin
  Close;
  FProviderName := Value;
  if FProviderName='' then Exit;
  try
    CreateDPlayWithoutDialog(FDPlay, Value);
  except
    FProviderName := '';
    raise;
  end;
end;

procedure TCustomDXPlay.SetTCPIPSetting(Value: TDXPlayTCPIPSetting);
begin
  FTCPIPSetting.Assign(Value);
end;

initialization
  CoInitialize(nil);
finalization
  CoUninitialize;
end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区三区四区中文字幕| 国产精品综合网| 精品国产1区二区| 欧美日韩亚洲另类| 欧美三级中文字幕在线观看| 在线视频你懂得一区二区三区| 国产91精品免费| 国产成人精品免费网站| zzijzzij亚洲日本少妇熟睡| 成人禁用看黄a在线| 丁香一区二区三区| 99视频精品免费视频| 一本色道久久综合亚洲精品按摩| 日韩电影免费在线| 九九国产精品视频| 国产麻豆精品在线观看| 欧美日韩你懂的| 久久综合九色综合欧美就去吻| 亚洲精品你懂的| 国产精品对白交换视频| 亚洲一二三区视频在线观看| 99九九99九九九视频精品| 亚洲最新在线观看| 天堂一区二区在线| 91色综合久久久久婷婷| 日韩精品一二区| 国产欧美日产一区| 欧美日韩精品一区二区三区蜜桃 | 国产精品国产三级国产aⅴ原创| 色综合久久久久久久久久久| 日韩在线观看一区二区| 欧美视频在线播放| 欧美一卡二卡三卡| 日韩精品一二三| 国产精品美女久久久久久| 欧美三级日韩三级国产三级| 国产福利一区在线| 天天综合天天综合色| 国产精品萝li| 欧美成人vps| 欧美日韩免费一区二区三区| 成人天堂资源www在线| 日本视频免费一区| 亚洲综合激情另类小说区| 国产欧美日韩不卡免费| 日韩免费看网站| 欧美唯美清纯偷拍| kk眼镜猥琐国模调教系列一区二区| 天堂va蜜桃一区二区三区 | 国产亚洲精品福利| 欧美电影一区二区| 色八戒一区二区三区| 国产黑丝在线一区二区三区| 丝袜亚洲另类欧美| 亚洲一卡二卡三卡四卡五卡| 国产精品入口麻豆原神| 久久综合久久久久88| 欧美日韩免费观看一区二区三区| 国产91对白在线观看九色| 日韩精品国产欧美| 中文字幕不卡在线| 2021中文字幕一区亚洲| 欧美一区日本一区韩国一区| 欧美亚州韩日在线看免费版国语版| 国产一区 二区 三区一级| 蜜桃av一区二区三区电影| 看片网站欧美日韩| 丝袜美腿高跟呻吟高潮一区| 亚洲成人av一区| 亚洲成人动漫在线观看| 艳妇臀荡乳欲伦亚洲一区| 18成人在线观看| 国产精品久久久久国产精品日日| 久久精品一区二区| 国产欧美久久久精品影院| 久久五月婷婷丁香社区| 精品精品国产高清a毛片牛牛| 日韩一级精品视频在线观看| 欧美一卡在线观看| 欧美r级电影在线观看| 精品久久久久久久久久久院品网| 欧美一区二区三区白人| 精品污污网站免费看| 精品盗摄一区二区三区| 高清日韩电视剧大全免费| 亚洲国产精品一区二区久久恐怖片| 欧美另类一区二区三区| 欧美高清性hdvideosex| 日韩一区国产二区欧美三区| 精品日韩一区二区| 久久精品亚洲一区二区三区浴池| 国产精品无遮挡| 亚洲精品视频一区| 天天影视色香欲综合网老头| 另类调教123区| 国产成人精品三级| 91蜜桃网址入口| 欧美亚日韩国产aⅴ精品中极品| 欧美调教femdomvk| 精品国产免费人成电影在线观看四季 | 美国毛片一区二区三区| 久久超级碰视频| eeuss鲁一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃 | 日韩精品色哟哟| 另类调教123区| 北条麻妃国产九九精品视频| 欧美唯美清纯偷拍| 久久综合久久鬼色中文字| **性色生活片久久毛片| 日韩经典中文字幕一区| 国产精品99久久久久久宅男| 在线观看亚洲精品| 精品欧美一区二区在线观看| 国产精品美女一区二区| 日韩国产欧美三级| 成人动漫一区二区在线| 黄网站免费久久| 欧美亚洲国产怡红院影院| 欧美tickling网站挠脚心| 久久综合久久99| 亚洲成人av一区二区| 粉嫩久久99精品久久久久久夜| 91国产福利在线| 精品国产不卡一区二区三区| 亚洲美女一区二区三区| 国产一区二区三区香蕉| 日韩欧美你懂的| 亚洲综合一区二区三区| 亚洲午夜久久久久久久久久久| 七七婷婷婷婷精品国产| 99精品黄色片免费大全| 日韩视频不卡中文| 一区二区理论电影在线观看| 国产乱码精品一品二品| 91精品国产高清一区二区三区 | 美国毛片一区二区| 91高清视频在线| 亚洲国产成人私人影院tom| 国产成人综合在线播放| 亚洲一区二区免费视频| 亚洲成人av福利| 99精品视频在线观看免费| 久久新电视剧免费观看| 视频一区国产视频| 欧洲一区在线电影| 亚洲人快播电影网| 成人精品视频一区| 亚洲成人av电影| 一区二区三区四区av| 国产在线视视频有精品| 91精品国产综合久久久久久 | 91久久香蕉国产日韩欧美9色| 久久免费看少妇高潮| 免费国产亚洲视频| 欧美日韩国产a| 亚洲一区二区视频| 欧美艳星brazzers| 一区二区理论电影在线观看| 91麻豆精品在线观看| 亚洲欧美在线另类| 99精品久久只有精品| 日韩伦理av电影| 97精品电影院| 亚洲欧美日韩国产综合| 99久久精品国产一区| 国产精品国产三级国产aⅴ原创| 懂色av一区二区夜夜嗨| 国产精品欧美一区喷水| 成人aa视频在线观看| 中文久久乱码一区二区| av午夜精品一区二区三区| 中文av一区特黄| 色综合久久久久综合体| 亚洲一区二区五区| 精品国产a毛片| 日本一二三不卡| 久久久综合视频| 亚洲精品一区二区三区蜜桃下载 | 伊人色综合久久天天| 99久久综合色| 一区二区三区在线免费播放| 欧美日韩中文字幕一区二区| 青椒成人免费视频| 精品福利一二区| 国产.精品.日韩.另类.中文.在线.播放| 国产嫩草影院久久久久| 成人av在线资源| 洋洋av久久久久久久一区| 6080日韩午夜伦伦午夜伦| 久久66热偷产精品| 中文字幕一区二区日韩精品绯色| 色乱码一区二区三区88| 天天操天天干天天综合网| 欧美岛国在线观看| 成人一区二区在线观看| 亚洲一区二区欧美日韩| xnxx国产精品| 色综合咪咪久久| 精品一区二区三区不卡 |