Rev 1 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1 | Rev 4 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | interface |
3 | interface |
4 | 4 | ||
5 | {$INCLUDE DelphiXcfg.inc} |
5 | {$INCLUDE DelphiXcfg.inc} |
6 | 6 | ||
7 | uses |
7 | uses |
8 | Windows, SysUtils, Classes, Forms, DXClass, ActiveX, DirectX, DXETable; |
8 | Windows, SysUtils, Classes, Forms, DXClass, ActiveX, DXETable, |
- | 9 | {$IfDef StandardDX} |
|
- | 10 | DirectDraw, |
|
- | 11 | // Delphi 2010 cannot be use DirectPlay8 because structure was not rewriten |
|
- | 12 | // {$IfDef DX9} |
|
- | 13 | // DirectPlay8, DX7toDX8; |
|
- | 14 | // {$Else} |
|
- | 15 | DirectPlay; //old wersion, current in directory |
|
- | 16 | // {$EndIf} |
|
- | 17 | {$Else} |
|
- | 18 | DirectX; |
|
- | 19 | {$EndIf} |
|
9 | 20 | ||
10 | type |
21 | type |
- | 22 | {$IfDef DX9} |
|
- | 23 | TDPID = DWORD; |
|
- | 24 | {$EndIf} |
|
11 | 25 | ||
12 | { TDXPlayPlayer } |
26 | { TDXPlayPlayer } |
13 | 27 | ||
14 | TDXPlayPlayer = class(TCollectionItem) |
28 | TDXPlayPlayer = class(TCollectionItem) |
15 | private |
29 | private |
Line 86... | Line 100... | ||
86 | TDXPlaySendCompleteEvent = procedure(Sender: TObject; MessageID: DWORD; |
100 | TDXPlaySendCompleteEvent = procedure(Sender: TObject; MessageID: DWORD; |
87 | Result: TDXPlaySendCompleteResult; SendTime: Integer) of object; |
101 | Result: TDXPlaySendCompleteResult; SendTime: Integer) of object; |
88 | 102 | ||
89 | TCustomDXPlay = class(TComponent) |
103 | TCustomDXPlay = class(TComponent) |
90 | private |
104 | private |
91 | FDPlay: IDirectPlay4A; |
105 | FDPlay: //{$IfDef DX7} |
- | 106 | IDirectPlay4A;//{$Else}IDirectPlay8Address{$EndIf}; |
|
92 | FGUID: string; |
107 | FGUID: string; |
93 | FIsHost: Boolean; |
108 | FIsHost: Boolean; |
94 | FLocalPlayer: TDXPlayPlayer; |
109 | FLocalPlayer: TDXPlayPlayer; |
95 | FMaxPlayers: Integer; |
110 | FMaxPlayers: Integer; |
96 | FPlayers: TDXPlayPlayers; |
111 | FPlayers: TDXPlayPlayers; |
Line 114... | Line 129... | ||
114 | FModemSetting: TDXPlayModemSetting; |
129 | FModemSetting: TDXPlayModemSetting; |
115 | FTCPIPSetting: TDXPlayTCPIPSetting; |
130 | FTCPIPSetting: TDXPlayTCPIPSetting; |
116 | FAsync: Boolean; |
131 | FAsync: Boolean; |
117 | FAsyncSupported: Boolean; |
132 | FAsyncSupported: Boolean; |
118 | procedure ChangeDPlay; |
133 | procedure ChangeDPlay; |
119 | procedure CreateDPlayWithoutDialog(out DPlay: IDirectPlay4A; const ProviderName: string); |
134 | procedure CreateDPlayWithoutDialog(out DPlay: |
- | 135 | //{$IfDef DX7} |
|
- | 136 | IDirectPlay4A; |
|
- | 137 | //{$Else}IDirectPlay8Address{$EndIf}; |
|
- | 138 | const ProviderName: string); |
|
120 | function OpenDPlayWithLobby(out Name: string): Boolean; |
139 | function OpenDPlayWithLobby(out Name: string): Boolean; |
121 | function OpenDPlayWithoutLobby(out Name: string): Boolean; |
140 | function OpenDPlayWithoutLobby(out Name: string): Boolean; |
122 | function OpenDPlayWithoutLobby2(const NewSession: Boolean; const ProviderName, SessionName, PlayerName: string): Boolean; |
141 | function OpenDPlayWithoutLobby2(const NewSession: Boolean; const ProviderName, SessionName, PlayerName: string): Boolean; |
123 | procedure Open_(NameS: string); |
142 | procedure Open_(NameS: string); |
124 | procedure ReceiveMessage; |
143 | procedure ReceiveMessage; |
Line 189... | Line 208... | ||
189 | end; |
208 | end; |
190 | 209 | ||
191 | function DXPlayMessageType(P: Pointer): DWORD; |
210 | function DXPlayMessageType(P: Pointer): DWORD; |
192 | 211 | ||
193 | function DXPlayStringToGUID(const S: string): TGUID; |
212 | function DXPlayStringToGUID(const S: string): TGUID; |
194 | function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP: IDirectPlay; |
213 | function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP: |
- | 214 | //{$IfDef DX7} |
|
- | 215 | IDirectPlay; |
|
- | 216 | //{$Else}IDirectPlay8Server{$EndIf}; |
|
195 | pUnk: IUnknown): HRESULT; |
217 | pUnk: IUnknown): HRESULT; |
196 | 218 | ||
197 | implementation |
219 | implementation |
198 | 220 | ||
199 | uses DXPlayFm, DXConsts; |
221 | uses DXPlayFm, DXConsts; |
Line 222... | Line 244... | ||
222 | raise EDXPlayError.Create(WindowsErrorMsg(ErrorCode)); |
244 | raise EDXPlayError.Create(WindowsErrorMsg(ErrorCode)); |
223 | Result := P; |
245 | Result := P; |
224 | CoTaskMemFree(P); |
246 | CoTaskMemFree(P); |
225 | end; |
247 | end; |
226 | 248 | ||
227 | function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP: IDirectPlay; |
249 | function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP: |
- | 250 | //{$IfDef DX7} |
|
- | 251 | IDirectPlay; |
|
- | 252 | //{$Else}IDirectPlay8Server{$EndIf}; |
|
228 | pUnk: IUnknown): HRESULT; |
253 | pUnk: IUnknown): HRESULT; |
229 | type |
254 | type |
230 | TDirectPlayCreate= function(const lpGUID: TGUID; out lplpDP: IDirectPlay; pUnk: IUnknown): HRESULT; stdcall; |
255 | TDirectPlayCreate= function(const lpGUID: TGUID; out lplpDP: IDirectPlay; pUnk: IUnknown): HRESULT; stdcall; |
231 | begin |
256 | begin |
232 | Result := TDirectPlayCreate(DXLoadLibrary('DPlayX.dll', 'DirectPlayCreate')) |
257 | Result := TDirectPlayCreate(DXLoadLibrary('DPlayX.dll', 'DirectPlayCreate')) |
233 | (lpGUID, lplpDP, pUnk); |
258 | (lpGUID, lplpDP, pUnk); |
234 | end; |
259 | end; |
- | 260 | {$IFDEF UNICODE} |
|
- | 261 | function DXDirectPlayEnumerate(lpEnumDPCallback: TDPEnumDPCallbackW; lpContext: Pointer): HRESULT; |
|
- | 262 | type |
|
- | 263 | TDirectPlayEnumerateW= function(lpEnumDPCallback: TDPEnumDPCallbackW; lpContext: Pointer): HRESULT; stdcall; |
|
- | 264 | begin |
|
- | 265 | Result := TDirectPlayEnumerateW(DXLoadLibrary('DPlayX.dll', 'DirectPlayEnumerateW')) |
|
- | 266 | (lpEnumDPCallback, lpContext); |
|
- | 267 | end; |
|
235 | 268 | ||
- | 269 | function DXDirectPlayLobbyCreate(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyW; |
|
- | 270 | lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT; |
|
- | 271 | type |
|
- | 272 | TDirectPlayLobbyCreateW = function(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyW; |
|
- | 273 | lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT; stdcall; |
|
- | 274 | begin |
|
- | 275 | Result := TDirectPlayLobbyCreateW(DXLoadLibrary('DPlayX.dll', 'DirectPlayLobbyCreateW')) |
|
- | 276 | (lpguidSP, lplpDPL, lpUnk, lpData, dwDataSize); |
|
- | 277 | end; |
|
- | 278 | {$ELSE} |
|
236 | function DXDirectPlayEnumerateA(lpEnumDPCallback: TDPEnumDPCallbackA; lpContext: Pointer): HRESULT; |
279 | function DXDirectPlayEnumerate(lpEnumDPCallback: TDPEnumDPCallbackA; lpContext: Pointer): HRESULT; |
237 | type |
280 | type |
238 | TDirectPlayEnumerateA= function(lpEnumDPCallback: TDPEnumDPCallbackA; lpContext: Pointer): HRESULT; stdcall; |
281 | TDirectPlayEnumerateA= function(lpEnumDPCallback: TDPEnumDPCallbackA; lpContext: Pointer): HRESULT; stdcall; |
239 | begin |
282 | begin |
240 | Result := TDirectPlayEnumerateA(DXLoadLibrary('DPlayX.dll', 'DirectPlayEnumerateA')) |
283 | Result := TDirectPlayEnumerateA(DXLoadLibrary('DPlayX.dll', 'DirectPlayEnumerateA')) |
241 | (lpEnumDPCallback, lpContext); |
284 | (lpEnumDPCallback, lpContext); |
242 | end; |
285 | end; |
243 | 286 | ||
244 | function DXDirectPlayLobbyCreateA(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA; |
287 | function DXDirectPlayLobbyCreate(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA; |
245 | lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT; |
288 | lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT; |
246 | type |
289 | type |
247 | TDirectPlayLobbyCreateA = function(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA; |
290 | TDirectPlayLobbyCreateA = function(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA; |
248 | lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT; stdcall; |
291 | lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT; stdcall; |
249 | begin |
292 | begin |
250 | Result := TDirectPlayLobbyCreateA(DXLoadLibrary('DPlayX.dll', 'DirectPlayLobbyCreateA')) |
293 | Result := TDirectPlayLobbyCreateA(DXLoadLibrary('DPlayX.dll', 'DirectPlayLobbyCreateA')) |
251 | (lpguidSP, lplpDPL, lpUnk, lpData, dwDataSize); |
294 | (lpguidSP, lplpDPL, lpUnk, lpData, dwDataSize); |
252 | end; |
295 | end; |
253 | 296 | {$ENDIF} |
|
254 | { TDXPlayPlayers } |
297 | { TDXPlayPlayers } |
255 | 298 | ||
256 | constructor TDXPlayPlayers.Create; |
299 | constructor TDXPlayPlayers.Create; |
257 | begin |
300 | begin |
258 | inherited Create(TDXPlayPlayer); |
301 | inherited Create(TDXPlayPlayer); |
Line 314... | Line 357... | ||
314 | TStrings(lpContext).Add( PChar(lpData)); |
357 | TStrings(lpContext).Add( PChar(lpData)); |
315 | Result := True; |
358 | Result := True; |
316 | end; |
359 | end; |
317 | 360 | ||
318 | var |
361 | var |
- | 362 | {$IFDEF UNICODE} |
|
- | 363 | Lobby1: IDirectPlayLobbyW; |
|
- | 364 | Lobby: IDirectPlayLobby2W; |
|
- | 365 | DPlay: IDirectPlay4W; |
|
- | 366 | {$ELSE} |
|
319 | Lobby1: IDirectPlayLobbyA; |
367 | Lobby1: IDirectPlayLobbyA; |
320 | Lobby: IDirectPlayLobby2A; |
368 | Lobby: IDirectPlayLobby2A; |
321 | DPlay1: IDirectPlay; |
- | |
322 | DPlay: IDirectPlay4A; |
369 | DPlay: IDirectPlay4A; |
- | 370 | {$ENDIF} |
|
- | 371 | DPlay1: IDirectPlay; |
|
323 | lpAddress: Pointer; |
372 | lpAddress: Pointer; |
324 | dwAddressSize: DWORD; |
373 | dwAddressSize: DWORD; |
325 | begin |
374 | begin |
326 | if FModemNames=nil then |
375 | if FModemNames=nil then |
327 | begin |
376 | begin |
328 | FModemNames := TStringList.Create; |
377 | FModemNames := TStringList.Create; |
329 | try |
378 | try |
330 | if DXDirectPlayLobbyCreateA(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then |
379 | if DXDirectPlayLobbyCreate(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then |
331 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
380 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
332 | Lobby := Lobby1 as IDirectPlayLobby2A; |
381 | Lobby := Lobby1 as {$IFDEF UNICODE}IDirectPlayLobby2W{$ELSE}IDirectPlayLobby2A{$ENDIF}; |
333 | 382 | ||
334 | if DXDirectPlayCreate(DPSPGUID_MODEM, DPlay1, nil)<>0 then |
383 | if DXDirectPlayCreate(DPSPGUID_MODEM, DPlay1, nil)<>0 then |
335 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
384 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
336 | DPlay := DPlay1 as IDirectPlay4A; |
385 | DPlay := DPlay1 as {$IFDEF UNICODE}IDirectPlay4W{$ELSE}IDirectPlay4A{$ENDIF}; |
337 | 386 | ||
338 | { get size of player address for all players } |
387 | { get size of player address for all players } |
339 | if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, nil^, dwAddressSize)<>DPERR_BUFFERTOOSMALL then |
388 | if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, nil, dwAddressSize)<>DPERR_BUFFERTOOSMALL then |
340 | raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired); |
389 | raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired); |
341 | 390 | ||
342 | GetMem(lpAddress, dwAddressSize); |
391 | GetMem(lpAddress, dwAddressSize); |
343 | try |
392 | try |
344 | FillChar(lpAddress^, dwAddressSize, 0); |
393 | FillChar(lpAddress^, dwAddressSize, 0); |
345 | 394 | ||
346 | { get the address } |
395 | { get the address } |
347 | if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, lpAddress^, dwAddressSize)<>0 then |
396 | if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, lpAddress, dwAddressSize)<>0 then |
348 | raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired); |
397 | raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired); |
349 | 398 | ||
350 | { get modem strings from address and put them in the combo box } |
399 | { get modem strings from address and put them in the combo box } |
351 | if Lobby.EnumAddress(@EnumModemAddress, lpAddress^, dwAddressSize, FModemNames)<>0 then |
400 | if Lobby.EnumAddress(@EnumModemAddress, lpAddress^, dwAddressSize, FModemNames)<>0 then |
352 | raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired); |
401 | raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired); |
Line 468... | Line 517... | ||
468 | lpvMsgBuffer := nil; |
517 | lpvMsgBuffer := nil; |
469 | dwMsgBufferSize := 0; |
518 | dwMsgBufferSize := 0; |
470 | 519 | ||
471 | try |
520 | try |
472 | repeat |
521 | repeat |
473 | hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer^, dwMsgBufferSize); |
522 | hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer, dwMsgBufferSize); |
474 | 523 | ||
475 | if hr=DPERR_BUFFERTOOSMALL then |
524 | if hr=DPERR_BUFFERTOOSMALL then |
476 | begin |
525 | begin |
477 | ReAllocMem(lpvMsgBuffer, dwMsgBufferSize); |
526 | ReAllocMem(lpvMsgBuffer, dwMsgBufferSize); |
478 | hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer^, dwMsgBufferSize); |
527 | hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer, dwMsgBufferSize); |
479 | end; |
528 | end; |
480 | 529 | ||
481 | if (hr=0) and (dwMsgBufferSize>=SizeOf(TDPMSG_GENERIC)) then |
530 | if (hr=0) and (dwMsgBufferSize>=SizeOf(TDPMSG_GENERIC)) then |
482 | begin |
531 | begin |
483 | if idFrom=DPID_SYSMSG then |
532 | if idFrom=DPID_SYSMSG then |
Line 495... | Line 544... | ||
495 | Player.FID := Msg_CreatePlayerOrGroup.DPID; |
544 | Player.FID := Msg_CreatePlayerOrGroup.DPID; |
496 | Player.FRemotePlayer := True; |
545 | Player.FRemotePlayer := True; |
497 | 546 | ||
498 | with Msg_CreatePlayerOrGroup.dpnName do |
547 | with Msg_CreatePlayerOrGroup.dpnName do |
499 | begin |
548 | begin |
- | 549 | {$IFDEF UNICODE} |
|
- | 550 | if lpszShortNameW<>nil then |
|
- | 551 | Player.FName := lpszShortNameW; |
|
- | 552 | {$ELSE} |
|
500 | if lpszShortNameA<>nil then |
553 | if lpszShortNameA<>nil then |
501 | Player.FName := lpszShortNameA; |
554 | Player.FName := lpszShortNameA; |
- | 555 | {$ENDIF} |
|
502 | end; |
556 | end; |
503 | 557 | ||
504 | DoAddPlayer(Player); |
558 | DoAddPlayer(Player); |
505 | end; |
559 | end; |
506 | end; |
560 | end; |
Line 602... | Line 656... | ||
602 | if Assigned(FOnSendComplete) then FOnSendComplete(Self, MessageID, Result, SendTime); |
656 | if Assigned(FOnSendComplete) then FOnSendComplete(Self, MessageID, Result, SendTime); |
603 | end; |
657 | end; |
604 | 658 | ||
605 | function TCustomDXPlay.GetProviders: TStrings; |
659 | function TCustomDXPlay.GetProviders: TStrings; |
606 | 660 | ||
607 | function EnumProviderCallback(const lpguidSP: TGUID; lpSPName: LPSTR; |
661 | function EnumProviderCallback(const lpguidSP: TGUID; lpSPName: {$IFDEF UNICODE}LPCTSTR{$ELSE}LPSTR{$ENDIF}; |
608 | dwMajorVersion: DWORD; dwMinorVersion: DWORD; lpContext: Pointer): |
662 | dwMajorVersion: DWORD; dwMinorVersion: DWORD; lpContext: Pointer): |
609 | BOOL; stdcall; |
663 | BOOL; stdcall; |
610 | var |
664 | var |
611 | GUID: PGUID; |
665 | GUID: PGUID; |
612 | begin |
666 | begin |
Line 619... | Line 673... | ||
619 | begin |
673 | begin |
620 | if FProviders=nil then |
674 | if FProviders=nil then |
621 | begin |
675 | begin |
622 | FProviders := TStringList.Create; |
676 | FProviders := TStringList.Create; |
623 | try |
677 | try |
624 | DXDirectPlayEnumerateA(@EnumProviderCallback, FProviders); |
678 | DXDirectPlayEnumerate(@EnumProviderCallback, FProviders); |
625 | except |
679 | except |
626 | FProviders.Free; FProviders := nil; |
680 | FProviders.Free; FProviders := nil; |
627 | raise; |
681 | raise; |
628 | end; |
682 | end; |
629 | end; |
683 | end; |
Line 644... | Line 698... | ||
644 | Exit; |
698 | Exit; |
645 | end; |
699 | end; |
646 | 700 | ||
647 | Guid := New(PGUID); |
701 | Guid := New(PGUID); |
648 | Move(lpThisSD.guidInstance, Guid^, SizeOf(TGUID)); |
702 | Move(lpThisSD.guidInstance, Guid^, SizeOf(TGUID)); |
- | 703 | {$IFDEF UNICODE} |
|
- | 704 | TStrings(lpContext).AddObject(lpThisSD.lpszSessionNameW, TObject(Guid)); |
|
- | 705 | {$ELSE} |
|
649 | TStrings(lpContext).AddObject(lpThisSD.lpszSessionNameA, TObject(Guid)); |
706 | TStrings(lpContext).AddObject(lpThisSD.lpszSessionNameA, TObject(Guid)); |
650 | 707 | {$ENDIF} |
|
651 | Result := True; |
708 | Result := True; |
652 | end; |
709 | end; |
653 | 710 | ||
654 | var |
711 | var |
655 | dpDesc: TDPSessionDesc2; |
712 | dpDesc: TDPSessionDesc2; |
Line 696... | Line 753... | ||
696 | var |
753 | var |
697 | i: Integer; |
754 | i: Integer; |
698 | ProviderGUID: TGUID; |
755 | ProviderGUID: TGUID; |
699 | addressElements: array[0..15] of TDPCompoundAddressElement; |
756 | addressElements: array[0..15] of TDPCompoundAddressElement; |
700 | dwElementCount: Integer; |
757 | dwElementCount: Integer; |
- | 758 | {$IFDEF UNICODE} |
|
- | 759 | Lobby1: IDirectPlayLobbyW; |
|
- | 760 | Lobby: IDirectPlayLobby2W; |
|
- | 761 | {$ELSE} |
|
701 | Lobby1: IDirectPlayLobbyA; |
762 | Lobby1: IDirectPlayLobbyA; |
702 | Lobby: IDirectPlayLobby2A; |
763 | Lobby: IDirectPlayLobby2A; |
- | 764 | {$ENDIF} |
|
703 | lpAddress: Pointer; |
765 | lpAddress: Pointer; |
704 | dwAddressSize: DWORD; |
766 | dwAddressSize: DWORD; |
705 | begin |
767 | begin |
706 | i := Providers.IndexOf(ProviderName); |
768 | i := Providers.IndexOf(ProviderName); |
707 | if i=-1 then |
769 | if i=-1 then |
708 | raise EDXPlayError.CreateFmt(SDXPlayProviderNotFound, [ProviderName]); |
770 | raise EDXPlayError.CreateFmt(SDXPlayProviderNotFound, [ProviderName]); |
709 | ProviderGUID := PGUID(Providers.Objects[i])^; |
771 | ProviderGUID := PGUID(Providers.Objects[i])^; |
710 | 772 | ||
711 | { DirectPlay address making } |
773 | { DirectPlay address making } |
712 | if DXDirectPlayLobbyCreateA(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then |
774 | if DXDirectPlayLobbyCreate(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then |
713 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
775 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
714 | Lobby := Lobby1 as IDirectPlayLobby2A; |
776 | Lobby := Lobby1 as {$IFDEF UNICODE}IDirectPlayLobby2W{$ELSE}IDirectPlayLobby2A{$ENDIF}; |
715 | 777 | ||
716 | FillChar(addressElements, SizeOf(addressElements), 0); |
778 | FillChar(addressElements, SizeOf(addressElements), 0); |
717 | dwElementCount := 0; |
779 | dwElementCount := 0; |
718 | 780 | ||
719 | addressElements[dwElementCount].guidDataType := DPAID_ServiceProvider; |
781 | addressElements[dwElementCount].guidDataType := DPAID_ServiceProvider; |
Line 758... | Line 820... | ||
758 | addressElements[dwElementCount].lpData := @TCPIPSetting.FPort; |
820 | addressElements[dwElementCount].lpData := @TCPIPSetting.FPort; |
759 | Inc(dwElementCount); |
821 | Inc(dwElementCount); |
760 | end; |
822 | end; |
761 | end; |
823 | end; |
762 | 824 | ||
763 | if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, nil^, dwAddressSize)<>DPERR_BUFFERTOOSMALL then |
825 | if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, nil, dwAddressSize)<>DPERR_BUFFERTOOSMALL then |
764 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
826 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
765 | 827 | ||
766 | GetMem(lpAddress, dwAddressSize); |
828 | GetMem(lpAddress, dwAddressSize); |
767 | try |
829 | try |
768 | FillChar(lpAddress^, dwAddressSize, 0); |
830 | FillChar(lpAddress^, dwAddressSize, 0); |
769 | 831 | ||
770 | if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, lpAddress^, dwAddressSize)<>0 then |
832 | if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, lpAddress, dwAddressSize)<>0 then |
771 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
833 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
772 | 834 | ||
773 | { DirectPlay initialization } |
835 | { DirectPlay initialization } |
774 | if CoCreateInstance(CLSID_DirectPlay, nil, CLSCTX_INPROC_SERVER, IID_IDirectPlay4A, DPlay)<>0 then |
836 | if CoCreateInstance(CLSID_DirectPlay, nil, CLSCTX_INPROC_SERVER, IID_IDirectPlay4A, DPlay)<>0 then |
775 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
837 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
Line 835... | Line 897... | ||
835 | Player.FID := TDPID; |
897 | Player.FID := TDPID; |
836 | Player.FRemotePlayer := True; |
898 | Player.FRemotePlayer := True; |
837 | 899 | ||
838 | with lpName do |
900 | with lpName do |
839 | begin |
901 | begin |
- | 902 | {$IFDEF UNICODE} |
|
- | 903 | if lpszShortNameW<>nil then |
|
- | 904 | Player.FName := lpszShortNameW; |
|
- | 905 | {$ELSE} |
|
840 | if lpszShortNameA<>nil then |
906 | if lpszShortNameA<>nil then |
841 | Player.FName := lpszShortNameA; |
907 | Player.FName := lpszShortNameA; |
- | 908 | {$ENDIF} |
|
842 | end; |
909 | end; |
843 | 910 | ||
844 | Result := True; |
911 | Result := True; |
845 | end; |
912 | end; |
846 | 913 | ||
Line 860... | Line 927... | ||
860 | FRecvEvent[0] := CreateEvent(nil, False, False, nil); |
927 | FRecvEvent[0] := CreateEvent(nil, False, False, nil); |
861 | 928 | ||
862 | FLocalPlayer := TDXPlayPlayer.Create(FPlayers); |
929 | FLocalPlayer := TDXPlayPlayer.Create(FPlayers); |
863 | FLocalPlayer.FName := NameS; |
930 | FLocalPlayer.FName := NameS; |
864 | 931 | ||
865 | if FDPlay.CreatePlayer(FLocalPlayer.FID, Name, FRecvEvent[0], nil^, 0, 0)<>DP_OK then |
932 | if FDPlay.CreatePlayer(FLocalPlayer.FID, @Name, FRecvEvent[0], nil, 0, 0)<>DP_OK then |
866 | raise EDXPlayError.CreateFmt(SCannotOpened, [FSessionName]); |
933 | raise EDXPlayError.CreateFmt(SCannotOpened, [FSessionName]); |
867 | 934 | ||
868 | { Player enumeration } |
935 | { Player enumeration } |
869 | FDPlay.EnumPlayers(PGUID(nil)^, @EnumPlayersCallback2, Self, DPENUMPLAYERS_REMOTE); |
936 | FDPlay.EnumPlayers(PGUID(nil), @EnumPlayersCallback2, Self, DPENUMPLAYERS_REMOTE); |
870 | 937 | ||
871 | FIsHost := FPlayers.Count=1; |
938 | FIsHost := FPlayers.Count=1; |
872 | 939 | ||
873 | FCalledDoOpen := True; DoOpen; |
940 | FCalledDoOpen := True; DoOpen; |
874 | DoAddPlayer(FLocalPlayer); |
941 | DoAddPlayer(FLocalPlayer); |
Line 898... | Line 965... | ||
898 | end; |
965 | end; |
899 | 966 | ||
900 | function TCustomDXPlay.OpenDPlayWithLobby(out Name: string): Boolean; |
967 | function TCustomDXPlay.OpenDPlayWithLobby(out Name: string): Boolean; |
901 | var |
968 | var |
902 | DPlay1: IDirectPlay2; |
969 | DPlay1: IDirectPlay2; |
- | 970 | {$IFDEF UNICODE} |
|
- | 971 | Lobby: IDirectPlayLobbyW; |
|
- | 972 | {$ELSE} |
|
903 | Lobby: IDirectPlayLobbyA; |
973 | Lobby: IDirectPlayLobbyA; |
- | 974 | {$ENDIF} |
|
904 | dwSize: DWORD; |
975 | dwSize: DWORD; |
905 | ConnectionSettings: PDPLConnection; |
976 | ConnectionSettings: PDPLConnection; |
906 | begin |
977 | begin |
907 | Result := False; |
978 | Result := False; |
908 | 979 | ||
909 | if DXDirectPlayLobbyCreateA(PGUID(nil)^, Lobby, nil, nil, 0)<>0 then |
980 | if DXDirectPlayLobbyCreate(PGUID(nil)^, Lobby, nil, nil, 0)<>0 then |
910 | Exit; |
981 | Exit; |
911 | 982 | ||
912 | if Lobby.GetConnectionSettings(0, PDPLConnection(nil)^, dwSize)<>DPERR_BUFFERTOOSMALL then |
983 | if Lobby.GetConnectionSettings(0, PDPLConnection(nil), dwSize)<>DPERR_BUFFERTOOSMALL then |
913 | Exit; |
984 | Exit; |
914 | 985 | ||
915 | GetMem(ConnectionSettings, dwSize); |
986 | GetMem(ConnectionSettings, dwSize); |
916 | try |
987 | try |
917 | if Lobby.GetConnectionSettings(0, ConnectionSettings^, dwSize)<>0 then |
988 | if Lobby.GetConnectionSettings(0, ConnectionSettings, dwSize)<>0 then |
918 | Exit; |
989 | Exit; |
919 | 990 | ||
920 | with ConnectionSettings^.lpSessionDesc^ do |
991 | with ConnectionSettings^.lpSessionDesc^ do |
921 | begin |
992 | begin |
922 | dwFlags := DPSESSION_MIGRATEHOST or DPSESSION_KEEPALIVE or DPSESSION_DIRECTPLAYPROTOCOL; |
993 | dwFlags := DPSESSION_MIGRATEHOST or DPSESSION_KEEPALIVE or DPSESSION_DIRECTPLAYPROTOCOL; |
Line 931... | Line 1002... | ||
931 | FDPlay := DPlay1 as IDirectPlay4A; |
1002 | FDPlay := DPlay1 as IDirectPlay4A; |
932 | ChangeDPlay; |
1003 | ChangeDPlay; |
933 | 1004 | ||
934 | with ConnectionSettings.lpSessionDesc^ do |
1005 | with ConnectionSettings.lpSessionDesc^ do |
935 | begin |
1006 | begin |
- | 1007 | {$IFDEF UNICODE} |
|
- | 1008 | if lpszSessionNameW<>nil then |
|
- | 1009 | FSessionName := lpszSessionNameW; |
|
- | 1010 | {$ELSE} |
|
936 | if lpszSessionNameA<>nil then |
1011 | if lpszSessionNameA<>nil then |
937 | FSessionName := lpszSessionNameA; |
1012 | FSessionName := lpszSessionNameA; |
- | 1013 | {$ENDIF} |
|
938 | end; |
1014 | end; |
939 | 1015 | ||
940 | with ConnectionSettings.lpPlayerName^ do |
1016 | with ConnectionSettings.lpPlayerName^ do |
941 | begin |
1017 | begin |
- | 1018 | {$IFDEF UNICODE} |
|
- | 1019 | if lpszShortNameW<>nil then |
|
- | 1020 | Name := lpszShortNameW; |
|
- | 1021 | {$ELSE} |
|
942 | if lpszShortNameA<>nil then |
1022 | if lpszShortNameA<>nil then |
943 | Name := lpszShortNameA; |
1023 | Name := lpszShortNameA; |
- | 1024 | {$ENDIF} |
|
944 | end; |
1025 | end; |
945 | finally |
1026 | finally |
946 | FreeMem(ConnectionSettings); |
1027 | FreeMem(ConnectionSettings); |
947 | end; |
1028 | end; |
948 | 1029 | ||
Line 993... | Line 1074... | ||
993 | begin |
1074 | begin |
994 | { Session connection } |
1075 | { Session connection } |
995 | FillChar(dpDesc, SizeOf(dpDesc), 0); |
1076 | FillChar(dpDesc, SizeOf(dpDesc), 0); |
996 | dpDesc.dwSize := SizeOf(dpDesc); |
1077 | dpDesc.dwSize := SizeOf(dpDesc); |
997 | dpDesc.dwFlags := DPSESSION_MIGRATEHOST or DPSESSION_KEEPALIVE; |
1078 | dpDesc.dwFlags := DPSESSION_MIGRATEHOST or DPSESSION_KEEPALIVE; |
- | 1079 | {$IFDEF UNICODE} |
|
- | 1080 | dpDesc.lpszSessionNameW := {$IFDEF VER12UP}PChar{$ELSE}PWideChar{$ENDIF}(SessionName); |
|
- | 1081 | {$ELSE} |
|
998 | dpDesc.lpszSessionNameA := PChar(SessionName); |
1082 | dpDesc.lpszSessionNameA := PAnsiChar(SessionName); |
- | 1083 | {$ENDIF} |
|
999 | dpDesc.guidApplication := DXPlayStringToGUID(GUID); |
1084 | dpDesc.guidApplication := DXPlayStringToGUID(GUID); |
1000 | dpDesc.dwMaxPlayers := MaxPlayers; |
1085 | dpDesc.dwMaxPlayers := MaxPlayers; |
1001 | 1086 | ||
1002 | hr := FDPlay.Open(dpDesc, DPOPEN_CREATE); |
1087 | hr := FDPlay.Open(dpDesc, DPOPEN_CREATE); |
1003 | if hr=DPERR_USERCANCEL then Exit; |
1088 | if hr=DPERR_USERCANCEL then Exit; |
Line 1077... | Line 1162... | ||
1077 | begin |
1162 | begin |
1078 | { Message to me } |
1163 | { Message to me } |
1079 | DoMessage(FLocalPlayer, Data, DataSize); |
1164 | DoMessage(FLocalPlayer, Data, DataSize); |
1080 | end else |
1165 | end else |
1081 | if FAsync and FAsyncSupported then |
1166 | if FAsync and FAsyncSupported then |
1082 | FDPlay.SendEx(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED or DPSEND_ASYNC, Data^, DataSize, 0, 0, nil, nil) |
1167 | FDPlay.SendEx(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED or DPSEND_ASYNC, Data, DataSize, 0, 0, nil, nil) |
1083 | else |
1168 | else |
1084 | FDPlay.Send(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED, Data^, DataSize); |
1169 | FDPlay.Send(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED, Data^, DataSize); |
1085 | end; |
1170 | end; |
1086 | 1171 | ||
1087 | function TCustomDXPlay.SendMessageEx(ToID: TDPID; Data: Pointer; DataSize: Integer; |
1172 | function TCustomDXPlay.SendMessageEx(ToID: TDPID; Data: Pointer; DataSize: Integer; |
Line 1096... | Line 1181... | ||
1096 | if ToID=FLocalPlayer.ID then |
1181 | if ToID=FLocalPlayer.ID then |
1097 | begin |
1182 | begin |
1098 | { Ž©•ªˆ¶‚̃ƒbƒZ[ƒW } |
1183 | { Ž©•ªˆ¶‚̃ƒbƒZ[ƒW } |
1099 | DoMessage(FLocalPlayer, Data, DataSize); |
1184 | DoMessage(FLocalPlayer, Data, DataSize); |
1100 | end else |
1185 | end else |
1101 | FDPlay.SendEx(FLocalPlayer.ID, ToID, dwFlags, Data^, DataSize, |
1186 | FDPlay.SendEx(FLocalPlayer.ID, ToID, dwFlags, Data, DataSize, |
1102 | 0, 0, nil, @Result); // 0 ˆÈŠO‚̓Tƒ|[ƒg‚µ‚È‚¢ƒfƒoƒCƒX‚ ‚é‚̂Ŏg‚í‚È‚¢ |
1187 | 0, 0, nil, @Result); // 0 ˆÈŠO‚̓Tƒ|[ƒg‚µ‚È‚¢ƒfƒoƒCƒX‚ ‚é‚̂Ŏg‚í‚È‚¢ |
1103 | end; |
1188 | end; |
1104 | 1189 | ||
1105 | procedure TCustomDXPlay.SetGUID(const Value: string); |
1190 | procedure TCustomDXPlay.SetGUID(const Value: string); |
1106 | begin |
1191 | begin |