Rev 1 | Rev 10 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1 | Rev 4 | ||
---|---|---|---|
1 | unit DXPlay; |
1 | unit DXPlay; |
2 | 2 | ||
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 |
16 | FData: Pointer; |
30 | FData: Pointer; |
17 | FID: TDPID; |
31 | FID: TDPID; |
18 | FName: string; |
32 | FName: string; |
19 | FRemotePlayer: Boolean; |
33 | FRemotePlayer: Boolean; |
20 | public |
34 | public |
21 | property Data: Pointer read FData write FData; |
35 | property Data: Pointer read FData write FData; |
22 | property ID: TDPID read FID; |
36 | property ID: TDPID read FID; |
23 | property Name: string read FName; |
37 | property Name: string read FName; |
24 | property RemotePlayer: Boolean read FRemotePlayer; |
38 | property RemotePlayer: Boolean read FRemotePlayer; |
25 | end; |
39 | end; |
26 | 40 | ||
27 | { TDXPlayPlayers } |
41 | { TDXPlayPlayers } |
28 | 42 | ||
29 | TDXPlayPlayers = class(TCollection) |
43 | TDXPlayPlayers = class(TCollection) |
30 | private |
44 | private |
31 | function GetPlayer(Index: Integer): TDXPlayPlayer; |
45 | function GetPlayer(Index: Integer): TDXPlayPlayer; |
32 | public |
46 | public |
33 | constructor Create; |
47 | constructor Create; |
34 | function Find(ID: TDPID): TDXPlayPlayer; |
48 | function Find(ID: TDPID): TDXPlayPlayer; |
35 | function IndexOf(ID: TDPID): Integer; |
49 | function IndexOf(ID: TDPID): Integer; |
36 | property Players[Index: Integer]: TDXPlayPlayer read GetPlayer; default; |
50 | property Players[Index: Integer]: TDXPlayPlayer read GetPlayer; default; |
37 | end; |
51 | end; |
38 | 52 | ||
39 | { TDXPlayModemSetting } |
53 | { TDXPlayModemSetting } |
40 | 54 | ||
41 | TDXPlayModemSetting = class(TPersistent) |
55 | TDXPlayModemSetting = class(TPersistent) |
42 | private |
56 | private |
43 | FEnabled: Boolean; |
57 | FEnabled: Boolean; |
44 | FPhoneNumber: string; |
58 | FPhoneNumber: string; |
45 | FModemName: string; |
59 | FModemName: string; |
46 | FModemNames: TStrings; |
60 | FModemNames: TStrings; |
47 | function GetModemNames: TStrings; |
61 | function GetModemNames: TStrings; |
48 | public |
62 | public |
49 | destructor Destroy; override; |
63 | destructor Destroy; override; |
50 | procedure Assign(Source: TPersistent); override; |
64 | procedure Assign(Source: TPersistent); override; |
51 | property ModemName: string read FModemName write FModemName; |
65 | property ModemName: string read FModemName write FModemName; |
52 | property ModemNames: TStrings read GetModemNames; |
66 | property ModemNames: TStrings read GetModemNames; |
53 | published |
67 | published |
54 | property Enabled: Boolean read FEnabled write FEnabled; |
68 | property Enabled: Boolean read FEnabled write FEnabled; |
55 | property PhoneNumber: string read FPhoneNumber write FPhoneNumber; |
69 | property PhoneNumber: string read FPhoneNumber write FPhoneNumber; |
56 | end; |
70 | end; |
57 | 71 | ||
58 | { TDXPlayTCPIPSetting } |
72 | { TDXPlayTCPIPSetting } |
59 | 73 | ||
60 | TDXPlayTCPIPSetting = class(TPersistent) |
74 | TDXPlayTCPIPSetting = class(TPersistent) |
61 | private |
75 | private |
62 | FEnabled: Boolean; |
76 | FEnabled: Boolean; |
63 | FHostName: string; |
77 | FHostName: string; |
64 | FPort: Word; |
78 | FPort: Word; |
65 | public |
79 | public |
66 | procedure Assign(Source: TPersistent); override; |
80 | procedure Assign(Source: TPersistent); override; |
67 | published |
81 | published |
68 | property Enabled: Boolean read FEnabled write FEnabled; |
82 | property Enabled: Boolean read FEnabled write FEnabled; |
69 | property HostName: string read FHostName write FHostName; |
83 | property HostName: string read FHostName write FHostName; |
70 | property Port: Word read FPort write FPort; |
84 | property Port: Word read FPort write FPort; |
71 | end; |
85 | end; |
72 | 86 | ||
73 | { EDXPlayError } |
87 | { EDXPlayError } |
74 | 88 | ||
75 | EDXPlayError = class(Exception); |
89 | EDXPlayError = class(Exception); |
76 | 90 | ||
77 | { TCustomDXPlay } |
91 | { TCustomDXPlay } |
78 | 92 | ||
79 | TDXPlayEvent = procedure(Sender: TObject; Player: TDXPlayPlayer) of object; |
93 | TDXPlayEvent = procedure(Sender: TObject; Player: TDXPlayPlayer) of object; |
80 | 94 | ||
81 | TDXPlayMessageEvent = procedure(Sender: TObject; From: TDXPlayPlayer; |
95 | TDXPlayMessageEvent = procedure(Sender: TObject; From: TDXPlayPlayer; |
82 | Data: Pointer; DataSize: Integer) of object; |
96 | Data: Pointer; DataSize: Integer) of object; |
83 | 97 | ||
84 | TDXPlaySendCompleteResult = (crOk, crAbort, crGeneric); |
98 | TDXPlaySendCompleteResult = (crOk, crAbort, crGeneric); |
85 | 99 | ||
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; |
97 | FCalledDoOpen: Boolean; |
112 | FCalledDoOpen: Boolean; |
98 | FOnAddPlayer: TDXPlayEvent; |
113 | FOnAddPlayer: TDXPlayEvent; |
99 | FOnClose: TNotifyEvent; |
114 | FOnClose: TNotifyEvent; |
100 | FOnDeletePlayer: TDXPlayEvent; |
115 | FOnDeletePlayer: TDXPlayEvent; |
101 | FOnMessage: TDXPlayMessageEvent; |
116 | FOnMessage: TDXPlayMessageEvent; |
102 | FOnOpen: TNotifyEvent; |
117 | FOnOpen: TNotifyEvent; |
103 | FOnSendComplete: TDXPlaySendCompleteEvent; |
118 | FOnSendComplete: TDXPlaySendCompleteEvent; |
104 | FOnSessionLost: TNotifyEvent; |
119 | FOnSessionLost: TNotifyEvent; |
105 | FOpened: Boolean; |
120 | FOpened: Boolean; |
106 | FRecvEvent: array[0..1] of THandle; |
121 | FRecvEvent: array[0..1] of THandle; |
107 | FRecvThread: TThread; |
122 | FRecvThread: TThread; |
108 | FInThread: Boolean; |
123 | FInThread: Boolean; |
109 | FProviderName: string; |
124 | FProviderName: string; |
110 | FProviders: TStrings; |
125 | FProviders: TStrings; |
111 | FSessionName: string; |
126 | FSessionName: string; |
112 | FSessions: TStrings; |
127 | FSessions: TStrings; |
113 | FReadSessioned: Boolean; |
128 | FReadSessioned: Boolean; |
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; |
125 | function GetProviders: TStrings; |
144 | function GetProviders: TStrings; |
126 | function GetSessionsPty: TStrings; |
145 | function GetSessionsPty: TStrings; |
127 | procedure ClearSessionList; |
146 | procedure ClearSessionList; |
128 | procedure SetGUID(const Value: string); |
147 | procedure SetGUID(const Value: string); |
129 | procedure SetModemSetting(Value: TDXPlayModemSetting); |
148 | procedure SetModemSetting(Value: TDXPlayModemSetting); |
130 | procedure SetProviderName(const Value: string); |
149 | procedure SetProviderName(const Value: string); |
131 | procedure SetTCPIPSetting(Value: TDXPlayTCPIPSetting); |
150 | procedure SetTCPIPSetting(Value: TDXPlayTCPIPSetting); |
132 | protected |
151 | protected |
133 | procedure DoAddPlayer(Player: TDXPlayPlayer); virtual; |
152 | procedure DoAddPlayer(Player: TDXPlayPlayer); virtual; |
134 | procedure DoClose; virtual; |
153 | procedure DoClose; virtual; |
135 | procedure DoDeletePlayer(Player: TDXPlayPlayer); virtual; |
154 | procedure DoDeletePlayer(Player: TDXPlayPlayer); virtual; |
136 | procedure DoMessage(From: TDXPlayPlayer; Data: Pointer; DataSize: Integer); virtual; |
155 | procedure DoMessage(From: TDXPlayPlayer; Data: Pointer; DataSize: Integer); virtual; |
137 | procedure DoOpen; virtual; |
156 | procedure DoOpen; virtual; |
138 | procedure DoSessionLost; virtual; |
157 | procedure DoSessionLost; virtual; |
139 | procedure DoSendComplete(MessageID: DWORD; Result: TDXPlaySendCompleteResult; |
158 | procedure DoSendComplete(MessageID: DWORD; Result: TDXPlaySendCompleteResult; |
140 | SendTime: Integer); virtual; |
159 | SendTime: Integer); virtual; |
141 | public |
160 | public |
142 | constructor Create(AOwner: TComponent); override; |
161 | constructor Create(AOwner: TComponent); override; |
143 | destructor Destroy; override; |
162 | destructor Destroy; override; |
144 | procedure Close; |
163 | procedure Close; |
145 | procedure Open; |
164 | procedure Open; |
146 | procedure Open2(NewSession: Boolean; const SessionName, PlayerName: string); |
165 | procedure Open2(NewSession: Boolean; const SessionName, PlayerName: string); |
147 | function GetProviderNameFromGUID(const ProviderGUID: TGUID): string; |
166 | function GetProviderNameFromGUID(const ProviderGUID: TGUID): string; |
148 | procedure GetSessions; |
167 | procedure GetSessions; |
149 | procedure SendMessage(ToID: TDPID; Data: Pointer; DataSize: Integer); |
168 | procedure SendMessage(ToID: TDPID; Data: Pointer; DataSize: Integer); |
150 | function SendMessageEx(ToID: TDPID; Data: Pointer; DataSize: Integer; |
169 | function SendMessageEx(ToID: TDPID; Data: Pointer; DataSize: Integer; |
151 | dwFlags: DWORD): DWORD; |
170 | dwFlags: DWORD): DWORD; |
152 | property GUID: string read FGUID write SetGUID; |
171 | property GUID: string read FGUID write SetGUID; |
153 | property IsHost: Boolean read FIsHost; |
172 | property IsHost: Boolean read FIsHost; |
154 | property LocalPlayer: TDXPlayPlayer read FLocalPlayer; |
173 | property LocalPlayer: TDXPlayPlayer read FLocalPlayer; |
155 | property MaxPlayers: Integer read FMaxPlayers write FMaxPlayers; |
174 | property MaxPlayers: Integer read FMaxPlayers write FMaxPlayers; |
156 | property OnAddPlayer: TDXPlayEvent read FOnAddPlayer write FOnAddPlayer; |
175 | property OnAddPlayer: TDXPlayEvent read FOnAddPlayer write FOnAddPlayer; |
157 | property OnClose: TNotifyEvent read FOnClose write FOnClose; |
176 | property OnClose: TNotifyEvent read FOnClose write FOnClose; |
158 | property OnDeletePlayer: TDXPlayEvent read FOnDeletePlayer write FOnDeletePlayer; |
177 | property OnDeletePlayer: TDXPlayEvent read FOnDeletePlayer write FOnDeletePlayer; |
159 | property OnMessage: TDXPlayMessageEvent read FOnMessage write FOnMessage; |
178 | property OnMessage: TDXPlayMessageEvent read FOnMessage write FOnMessage; |
160 | property OnOpen: TNotifyEvent read FOnOpen write FOnOpen; |
179 | property OnOpen: TNotifyEvent read FOnOpen write FOnOpen; |
161 | property OnSendComplete: TDXPlaySendCompleteEvent read FOnSendComplete write FOnSendComplete; |
180 | property OnSendComplete: TDXPlaySendCompleteEvent read FOnSendComplete write FOnSendComplete; |
162 | property OnSessionLost: TNotifyEvent read FOnSessionLost write FOnSessionLost; |
181 | property OnSessionLost: TNotifyEvent read FOnSessionLost write FOnSessionLost; |
163 | property Opened: Boolean read FOpened; |
182 | property Opened: Boolean read FOpened; |
164 | property Players: TDXPlayPlayers read FPlayers; |
183 | property Players: TDXPlayPlayers read FPlayers; |
165 | property ProviderName: string read FProviderName write SetProviderName; |
184 | property ProviderName: string read FProviderName write SetProviderName; |
166 | property Providers: TStrings read GetProviders; |
185 | property Providers: TStrings read GetProviders; |
167 | property SessionName: string read FSessionName; |
186 | property SessionName: string read FSessionName; |
168 | property Sessions: TStrings read GetSessionsPty; |
187 | property Sessions: TStrings read GetSessionsPty; |
169 | property ModemSetting: TDXPlayModemSetting read FModemSetting write SetModemSetting; |
188 | property ModemSetting: TDXPlayModemSetting read FModemSetting write SetModemSetting; |
170 | property TCPIPSetting: TDXPlayTCPIPSetting read FTCPIPSetting write SetTCPIPSetting; |
189 | property TCPIPSetting: TDXPlayTCPIPSetting read FTCPIPSetting write SetTCPIPSetting; |
171 | property Async: Boolean read FAsync write FAsync; |
190 | property Async: Boolean read FAsync write FAsync; |
172 | property AsyncSupported: Boolean read FAsyncSupported; |
191 | property AsyncSupported: Boolean read FAsyncSupported; |
173 | end; |
192 | end; |
174 | 193 | ||
175 | TDXPlay = class(TCustomDXPlay) |
194 | TDXPlay = class(TCustomDXPlay) |
176 | published |
195 | published |
177 | property Async; |
196 | property Async; |
178 | property GUID; |
197 | property GUID; |
179 | property MaxPlayers; |
198 | property MaxPlayers; |
180 | property ModemSetting; |
199 | property ModemSetting; |
181 | property TCPIPSetting; |
200 | property TCPIPSetting; |
182 | property OnAddPlayer; |
201 | property OnAddPlayer; |
183 | property OnClose; |
202 | property OnClose; |
184 | property OnDeletePlayer; |
203 | property OnDeletePlayer; |
185 | property OnMessage; |
204 | property OnMessage; |
186 | property OnOpen; |
205 | property OnOpen; |
187 | property OnSendComplete; |
206 | property OnSendComplete; |
188 | property OnSessionLost; |
207 | property OnSessionLost; |
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; |
200 | 222 | ||
201 | function DXPlayMessageType(P: Pointer): DWORD; |
223 | function DXPlayMessageType(P: Pointer): DWORD; |
202 | begin |
224 | begin |
203 | Result := PDPMSG_GENERIC(P)^.dwType; |
225 | Result := PDPMSG_GENERIC(P)^.dwType; |
204 | end; |
226 | end; |
205 | 227 | ||
206 | function DXPlayStringToGUID(const S: string): TGUID; |
228 | function DXPlayStringToGUID(const S: string): TGUID; |
207 | var |
229 | var |
208 | ErrorCode: Integer; |
230 | ErrorCode: Integer; |
209 | begin |
231 | begin |
210 | ErrorCode := CLSIDFromString(PWideChar(WideString(S)), Result); |
232 | ErrorCode := CLSIDFromString(PWideChar(WideString(S)), Result); |
211 | if ErrorCode<0 then |
233 | if ErrorCode<0 then |
212 | raise EDXPlayError.Create(WindowsErrorMsg(ErrorCode)); |
234 | raise EDXPlayError.Create(WindowsErrorMsg(ErrorCode)); |
213 | end; |
235 | end; |
214 | 236 | ||
215 | function GUIDToString(const ClassID: TGUID): string; |
237 | function GUIDToString(const ClassID: TGUID): string; |
216 | var |
238 | var |
217 | ErrorCode: Integer; |
239 | ErrorCode: Integer; |
218 | P: PWideChar; |
240 | P: PWideChar; |
219 | begin |
241 | begin |
220 | ErrorCode := StringFromCLSID(ClassID, P); |
242 | ErrorCode := StringFromCLSID(ClassID, P); |
221 | if ErrorCode<0 then |
243 | if ErrorCode<0 then |
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); |
259 | end; |
302 | end; |
260 | 303 | ||
261 | function TDXPlayPlayers.Find(ID: TDPID): TDXPlayPlayer; |
304 | function TDXPlayPlayers.Find(ID: TDPID): TDXPlayPlayer; |
262 | var |
305 | var |
263 | i: Integer; |
306 | i: Integer; |
264 | begin |
307 | begin |
265 | i := IndexOf(ID); |
308 | i := IndexOf(ID); |
266 | if i=-1 then |
309 | if i=-1 then |
267 | raise EDXPlayError.Create(SDXPlayPlayerNotFound); |
310 | raise EDXPlayError.Create(SDXPlayPlayerNotFound); |
268 | Result := Players[i]; |
311 | Result := Players[i]; |
269 | end; |
312 | end; |
270 | 313 | ||
271 | function TDXPlayPlayers.IndexOf(ID: TDPID): Integer; |
314 | function TDXPlayPlayers.IndexOf(ID: TDPID): Integer; |
272 | var |
315 | var |
273 | i: Integer; |
316 | i: Integer; |
274 | begin |
317 | begin |
275 | for i:=0 to Count-1 do |
318 | for i:=0 to Count-1 do |
276 | if Players[i].FID=ID then |
319 | if Players[i].FID=ID then |
277 | begin |
320 | begin |
278 | Result := i; |
321 | Result := i; |
279 | Exit; |
322 | Exit; |
280 | end; |
323 | end; |
281 | Result := -1; |
324 | Result := -1; |
282 | end; |
325 | end; |
283 | 326 | ||
284 | function TDXPlayPlayers.GetPlayer(Index: Integer): TDXPlayPlayer; |
327 | function TDXPlayPlayers.GetPlayer(Index: Integer): TDXPlayPlayer; |
285 | begin |
328 | begin |
286 | Result := TDXPlayPlayer(Items[Index]); |
329 | Result := TDXPlayPlayer(Items[Index]); |
287 | end; |
330 | end; |
288 | 331 | ||
289 | { TDXPlayModemSetting } |
332 | { TDXPlayModemSetting } |
290 | 333 | ||
291 | destructor TDXPlayModemSetting.Destroy; |
334 | destructor TDXPlayModemSetting.Destroy; |
292 | begin |
335 | begin |
293 | FModemNames.Free; |
336 | FModemNames.Free; |
294 | inherited Destroy; |
337 | inherited Destroy; |
295 | end; |
338 | end; |
296 | 339 | ||
297 | procedure TDXPlayModemSetting.Assign(Source: TPersistent); |
340 | procedure TDXPlayModemSetting.Assign(Source: TPersistent); |
298 | begin |
341 | begin |
299 | if Source is TDXPlayModemSetting then |
342 | if Source is TDXPlayModemSetting then |
300 | begin |
343 | begin |
301 | FEnabled := TDXPlayModemSetting(Source).FEnabled; |
344 | FEnabled := TDXPlayModemSetting(Source).FEnabled; |
302 | FPhoneNumber := TDXPlayModemSetting(Source).FPhoneNumber; |
345 | FPhoneNumber := TDXPlayModemSetting(Source).FPhoneNumber; |
303 | FModemName := TDXPlayModemSetting(Source).FModemName; |
346 | FModemName := TDXPlayModemSetting(Source).FModemName; |
304 | end else |
347 | end else |
305 | inherited Assign(Source); |
348 | inherited Assign(Source); |
306 | end; |
349 | end; |
307 | 350 | ||
308 | function TDXPlayModemSetting.GetModemNames: TStrings; |
351 | function TDXPlayModemSetting.GetModemNames: TStrings; |
309 | 352 | ||
310 | function EnumModemAddress(const guidDataType: TGUID; |
353 | function EnumModemAddress(const guidDataType: TGUID; |
311 | dwDataSize: DWORD; lpData: Pointer; lpContext: Pointer): BOOL; stdcall; |
354 | dwDataSize: DWORD; lpData: Pointer; lpContext: Pointer): BOOL; stdcall; |
312 | begin |
355 | begin |
313 | if CompareMem(@guidDataType, @DPAID_Modem, SizeOf(TGUID)) then |
356 | if CompareMem(@guidDataType, @DPAID_Modem, SizeOf(TGUID)) then |
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); |
353 | finally |
402 | finally |
354 | FreeMem(lpAddress); |
403 | FreeMem(lpAddress); |
355 | end; |
404 | end; |
356 | except |
405 | except |
357 | FModemNames.Free; FModemNames := nil; |
406 | FModemNames.Free; FModemNames := nil; |
358 | raise; |
407 | raise; |
359 | end; |
408 | end; |
360 | end; |
409 | end; |
361 | 410 | ||
362 | Result := FModemNames; |
411 | Result := FModemNames; |
363 | end; |
412 | end; |
364 | 413 | ||
365 | { TDXPlayTCPIPSetting } |
414 | { TDXPlayTCPIPSetting } |
366 | 415 | ||
367 | procedure TDXPlayTCPIPSetting.Assign(Source: TPersistent); |
416 | procedure TDXPlayTCPIPSetting.Assign(Source: TPersistent); |
368 | begin |
417 | begin |
369 | if Source is TDXPlayTCPIPSetting then |
418 | if Source is TDXPlayTCPIPSetting then |
370 | begin |
419 | begin |
371 | FEnabled := TDXPlayTCPIPSetting(Source).FEnabled; |
420 | FEnabled := TDXPlayTCPIPSetting(Source).FEnabled; |
372 | FHostName := TDXPlayTCPIPSetting(Source).FHostName; |
421 | FHostName := TDXPlayTCPIPSetting(Source).FHostName; |
373 | end else |
422 | end else |
374 | inherited Assign(Source); |
423 | inherited Assign(Source); |
375 | end; |
424 | end; |
376 | 425 | ||
377 | { TCustomDXPlay } |
426 | { TCustomDXPlay } |
378 | 427 | ||
379 | constructor TCustomDXPlay.Create(AOwner: TComponent); |
428 | constructor TCustomDXPlay.Create(AOwner: TComponent); |
380 | begin |
429 | begin |
381 | inherited Create(AOwner); |
430 | inherited Create(AOwner); |
382 | FPlayers := TDXPlayPlayers.Create; |
431 | FPlayers := TDXPlayPlayers.Create; |
383 | FModemSetting := TDXPlayModemSetting.Create; |
432 | FModemSetting := TDXPlayModemSetting.Create; |
384 | FTCPIPSetting := TDXPlayTCPIPSetting.Create; |
433 | FTCPIPSetting := TDXPlayTCPIPSetting.Create; |
385 | FSessions := TStringList.Create; |
434 | FSessions := TStringList.Create; |
386 | 435 | ||
387 | FGUID := GUIDToString(GUID_NULL); |
436 | FGUID := GUIDToString(GUID_NULL); |
388 | FMaxPlayers := 0; |
437 | FMaxPlayers := 0; |
389 | end; |
438 | end; |
390 | 439 | ||
391 | destructor TCustomDXPlay.Destroy; |
440 | destructor TCustomDXPlay.Destroy; |
392 | var |
441 | var |
393 | i: Integer; |
442 | i: Integer; |
394 | begin |
443 | begin |
395 | Close; |
444 | Close; |
396 | 445 | ||
397 | FPlayers.Free; |
446 | FPlayers.Free; |
398 | 447 | ||
399 | if FProviders<>nil then |
448 | if FProviders<>nil then |
400 | begin |
449 | begin |
401 | for i:=0 to FProviders.Count-1 do |
450 | for i:=0 to FProviders.Count-1 do |
402 | Dispose(PGUID(FProviders.Objects[i])); |
451 | Dispose(PGUID(FProviders.Objects[i])); |
403 | end; |
452 | end; |
404 | FProviders.Free; |
453 | FProviders.Free; |
405 | FModemSetting.Free; |
454 | FModemSetting.Free; |
406 | FTCPIPSetting.Free; |
455 | FTCPIPSetting.Free; |
407 | ClearSessionList; |
456 | ClearSessionList; |
408 | FSessions.Free; |
457 | FSessions.Free; |
409 | inherited Destroy; |
458 | inherited Destroy; |
410 | end; |
459 | end; |
411 | 460 | ||
412 | type |
461 | type |
413 | TDXPlayRecvThread = class(TThread) |
462 | TDXPlayRecvThread = class(TThread) |
414 | private |
463 | private |
415 | FDXPlay: TCustomDXPlay; |
464 | FDXPlay: TCustomDXPlay; |
416 | constructor Create(DXPlay: TCustomDXPlay); |
465 | constructor Create(DXPlay: TCustomDXPlay); |
417 | destructor Destroy; override; |
466 | destructor Destroy; override; |
418 | procedure Execute; override; |
467 | procedure Execute; override; |
419 | end; |
468 | end; |
420 | 469 | ||
421 | constructor TDXPlayRecvThread.Create(DXPlay: TCustomDXPlay); |
470 | constructor TDXPlayRecvThread.Create(DXPlay: TCustomDXPlay); |
422 | begin |
471 | begin |
423 | FDXPlay := DXPlay; |
472 | FDXPlay := DXPlay; |
424 | 473 | ||
425 | FDXPlay.FRecvEvent[1] := CreateEvent(nil, False, False, nil); |
474 | FDXPlay.FRecvEvent[1] := CreateEvent(nil, False, False, nil); |
426 | 475 | ||
427 | FreeOnTerminate := True; |
476 | FreeOnTerminate := True; |
428 | inherited Create(True); |
477 | inherited Create(True); |
429 | end; |
478 | end; |
430 | 479 | ||
431 | destructor TDXPlayRecvThread.Destroy; |
480 | destructor TDXPlayRecvThread.Destroy; |
432 | begin |
481 | begin |
433 | FreeOnTerminate := False; |
482 | FreeOnTerminate := False; |
434 | SetEvent(FDXPlay.FRecvEvent[1]); |
483 | SetEvent(FDXPlay.FRecvEvent[1]); |
435 | 484 | ||
436 | inherited Destroy; |
485 | inherited Destroy; |
437 | 486 | ||
438 | CloseHandle(FDXPlay.FRecvEvent[1]); |
487 | CloseHandle(FDXPlay.FRecvEvent[1]); |
439 | 488 | ||
440 | FDXPlay.FRecvThread := nil; |
489 | FDXPlay.FRecvThread := nil; |
441 | FDXPlay.Close; |
490 | FDXPlay.Close; |
442 | end; |
491 | end; |
443 | 492 | ||
444 | procedure TDXPlayRecvThread.Execute; |
493 | procedure TDXPlayRecvThread.Execute; |
445 | begin |
494 | begin |
446 | while WaitForMultipleObjects(2, @FDXPlay.FRecvEvent, False, INFINITE)=WAIT_OBJECT_0 do |
495 | while WaitForMultipleObjects(2, @FDXPlay.FRecvEvent, False, INFINITE)=WAIT_OBJECT_0 do |
447 | begin |
496 | begin |
448 | Synchronize(FDXPlay.ReceiveMessage); |
497 | Synchronize(FDXPlay.ReceiveMessage); |
449 | end; |
498 | end; |
450 | end; |
499 | end; |
451 | 500 | ||
452 | procedure TCustomDXPlay.ReceiveMessage; |
501 | procedure TCustomDXPlay.ReceiveMessage; |
453 | var |
502 | var |
454 | idFrom, idTo: DWORD; |
503 | idFrom, idTo: DWORD; |
455 | hr: HRESULT; |
504 | hr: HRESULT; |
456 | lpvMsgBuffer: Pointer; |
505 | lpvMsgBuffer: Pointer; |
457 | dwMsgBufferSize: DWORD; |
506 | dwMsgBufferSize: DWORD; |
458 | Msg_CreatePlayerOrGroup: PDPMSG_CREATEPLAYERORGROUP; |
507 | Msg_CreatePlayerOrGroup: PDPMSG_CREATEPLAYERORGROUP; |
459 | Msg_DeletePlayerOrGroup: PDPMSG_DESTROYPLAYERORGROUP; |
508 | Msg_DeletePlayerOrGroup: PDPMSG_DESTROYPLAYERORGROUP; |
460 | Msg_SendComplete: PDPMsg_SendComplete; |
509 | Msg_SendComplete: PDPMsg_SendComplete; |
461 | SendCompleteResult: TDXPlaySendCompleteResult; |
510 | SendCompleteResult: TDXPlaySendCompleteResult; |
462 | Player: TDXPlayPlayer; |
511 | Player: TDXPlayPlayer; |
463 | i: Integer; |
512 | i: Integer; |
464 | begin |
513 | begin |
465 | FInThread := True; |
514 | FInThread := True; |
466 | try |
515 | try |
467 | try |
516 | try |
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 |
484 | begin |
533 | begin |
485 | { System message } |
534 | { System message } |
486 | case PDPMSG_GENERIC(lpvMsgBuffer)^.dwType of |
535 | case PDPMSG_GENERIC(lpvMsgBuffer)^.dwType of |
487 | DPSYS_CREATEPLAYERORGROUP: |
536 | DPSYS_CREATEPLAYERORGROUP: |
488 | begin |
537 | begin |
489 | { New player } |
538 | { New player } |
490 | Msg_CreatePlayerOrGroup := lpvMsgBuffer; |
539 | Msg_CreatePlayerOrGroup := lpvMsgBuffer; |
491 | 540 | ||
492 | if Msg_CreatePlayerOrGroup.DPID<>FLocalPlayer.FID then |
541 | if Msg_CreatePlayerOrGroup.DPID<>FLocalPlayer.FID then |
493 | begin |
542 | begin |
494 | Player := TDXPlayPlayer.Create(Players); |
543 | Player := TDXPlayPlayer.Create(Players); |
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; |
507 | DPSYS_DESTROYPLAYERORGROUP: |
561 | DPSYS_DESTROYPLAYERORGROUP: |
508 | begin |
562 | begin |
509 | { Player deletion } |
563 | { Player deletion } |
510 | Msg_DeletePlayerOrGroup := lpvMsgBuffer; |
564 | Msg_DeletePlayerOrGroup := lpvMsgBuffer; |
511 | 565 | ||
512 | if Msg_DeletePlayerOrGroup.DPID<>FLocalPlayer.FID then |
566 | if Msg_DeletePlayerOrGroup.DPID<>FLocalPlayer.FID then |
513 | begin |
567 | begin |
514 | i := Players.IndexOf(Msg_DeletePlayerOrGroup.DPID); |
568 | i := Players.IndexOf(Msg_DeletePlayerOrGroup.DPID); |
515 | if i<>-1 then |
569 | if i<>-1 then |
516 | begin |
570 | begin |
517 | Player := Players[i]; |
571 | Player := Players[i]; |
518 | DoDeletePlayer(Player); |
572 | DoDeletePlayer(Player); |
519 | Player.Free; |
573 | Player.Free; |
520 | end; |
574 | end; |
521 | end; |
575 | end; |
522 | end; |
576 | end; |
523 | DPSYS_SESSIONLOST: |
577 | DPSYS_SESSIONLOST: |
524 | begin |
578 | begin |
525 | { The session was lost. } |
579 | { The session was lost. } |
526 | DoSessionLost; |
580 | DoSessionLost; |
527 | Close; |
581 | Close; |
528 | end; |
582 | end; |
529 | DPSYS_HOST: |
583 | DPSYS_HOST: |
530 | begin |
584 | begin |
531 | { Here became a host. } |
585 | { Here became a host. } |
532 | FIsHost := True; |
586 | FIsHost := True; |
533 | end; |
587 | end; |
534 | DPSYS_SENDCOMPLETE: |
588 | DPSYS_SENDCOMPLETE: |
535 | begin |
589 | begin |
536 | { Send complete } |
590 | { Send complete } |
537 | Msg_SendComplete := lpvMsgBuffer; |
591 | Msg_SendComplete := lpvMsgBuffer; |
538 | if Msg_SendComplete.idFrom=FLocalPlayer.FID then |
592 | if Msg_SendComplete.idFrom=FLocalPlayer.FID then |
539 | begin |
593 | begin |
540 | case Msg_SendComplete.hr of |
594 | case Msg_SendComplete.hr of |
541 | DP_OK : SendCompleteResult := crOk; |
595 | DP_OK : SendCompleteResult := crOk; |
542 | DPERR_ABORTED: SendCompleteResult := crAbort; |
596 | DPERR_ABORTED: SendCompleteResult := crAbort; |
543 | else SendCompleteResult := crGeneric; |
597 | else SendCompleteResult := crGeneric; |
544 | end; |
598 | end; |
545 | 599 | ||
546 | DoSendComplete(Msg_SendComplete^.dwMsgID, SendCompleteResult, Msg_SendComplete^.dwSendTime); |
600 | DoSendComplete(Msg_SendComplete^.dwMsgID, SendCompleteResult, Msg_SendComplete^.dwSendTime); |
547 | end; |
601 | end; |
548 | end; |
602 | end; |
549 | end; |
603 | end; |
550 | end else |
604 | end else |
551 | begin |
605 | begin |
552 | { Application definition message } |
606 | { Application definition message } |
553 | DoMessage(Players.Find(idFrom), lpvMsgBuffer, dwMsgBufferSize); |
607 | DoMessage(Players.Find(idFrom), lpvMsgBuffer, dwMsgBufferSize); |
554 | end; |
608 | end; |
555 | end; |
609 | end; |
556 | until hr<>0; |
610 | until hr<>0; |
557 | finally |
611 | finally |
558 | FreeMem(lpvMsgBuffer); |
612 | FreeMem(lpvMsgBuffer); |
559 | end; |
613 | end; |
560 | except |
614 | except |
561 | on E: Exception do |
615 | on E: Exception do |
562 | Application.HandleException(E); |
616 | Application.HandleException(E); |
563 | end; |
617 | end; |
564 | finally |
618 | finally |
565 | FInThread := False; |
619 | FInThread := False; |
566 | end; |
620 | end; |
567 | end; |
621 | end; |
568 | 622 | ||
569 | procedure TCustomDXPlay.DoAddPlayer(Player: TDXPlayPlayer); |
623 | procedure TCustomDXPlay.DoAddPlayer(Player: TDXPlayPlayer); |
570 | begin |
624 | begin |
571 | if Assigned(FOnAddPlayer) then FOnAddPlayer(Self, Player) |
625 | if Assigned(FOnAddPlayer) then FOnAddPlayer(Self, Player) |
572 | end; |
626 | end; |
573 | 627 | ||
574 | procedure TCustomDXPlay.DoClose; |
628 | procedure TCustomDXPlay.DoClose; |
575 | begin |
629 | begin |
576 | if Assigned(FOnClose) then FOnClose(Self); |
630 | if Assigned(FOnClose) then FOnClose(Self); |
577 | end; |
631 | end; |
578 | 632 | ||
579 | procedure TCustomDXPlay.DoDeletePlayer(Player: TDXPlayPlayer); |
633 | procedure TCustomDXPlay.DoDeletePlayer(Player: TDXPlayPlayer); |
580 | begin |
634 | begin |
581 | if Assigned(FOnDeletePlayer) then FOnDeletePlayer(Self, Player) |
635 | if Assigned(FOnDeletePlayer) then FOnDeletePlayer(Self, Player) |
582 | end; |
636 | end; |
583 | 637 | ||
584 | procedure TCustomDXPlay.DoMessage(From: TDXPlayPlayer; Data: Pointer; DataSize: Integer); |
638 | procedure TCustomDXPlay.DoMessage(From: TDXPlayPlayer; Data: Pointer; DataSize: Integer); |
585 | begin |
639 | begin |
586 | if Assigned(FOnMessage) then FOnMessage(Self, From, Data, DataSize); |
640 | if Assigned(FOnMessage) then FOnMessage(Self, From, Data, DataSize); |
587 | end; |
641 | end; |
588 | 642 | ||
589 | procedure TCustomDXPlay.DoOpen; |
643 | procedure TCustomDXPlay.DoOpen; |
590 | begin |
644 | begin |
591 | if Assigned(FOnOpen) then FOnOpen(Self); |
645 | if Assigned(FOnOpen) then FOnOpen(Self); |
592 | end; |
646 | end; |
593 | 647 | ||
594 | procedure TCustomDXPlay.DoSessionLost; |
648 | procedure TCustomDXPlay.DoSessionLost; |
595 | begin |
649 | begin |
596 | if Assigned(FOnSessionLost) then FOnSessionLost(Self); |
650 | if Assigned(FOnSessionLost) then FOnSessionLost(Self); |
597 | end; |
651 | end; |
598 | 652 | ||
599 | procedure TCustomDXPlay.DoSendComplete(MessageID: DWORD; Result: TDXPlaySendCompleteResult; |
653 | procedure TCustomDXPlay.DoSendComplete(MessageID: DWORD; Result: TDXPlaySendCompleteResult; |
600 | SendTime: Integer); |
654 | SendTime: Integer); |
601 | begin |
655 | begin |
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 |
613 | GUID := New(PGUID); |
667 | GUID := New(PGUID); |
614 | Move(lpguidSP, GUID^, SizeOf(TGUID)); |
668 | Move(lpguidSP, GUID^, SizeOf(TGUID)); |
615 | TStrings(lpContext).AddObject(lpSPName, TObject(GUID)); |
669 | TStrings(lpContext).AddObject(lpSPName, TObject(GUID)); |
616 | Result := True; |
670 | Result := True; |
617 | end; |
671 | end; |
618 | 672 | ||
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; |
630 | 684 | ||
631 | Result := FProviders; |
685 | Result := FProviders; |
632 | end; |
686 | end; |
633 | 687 | ||
634 | procedure TCustomDXPlay.GetSessions; |
688 | procedure TCustomDXPlay.GetSessions; |
635 | 689 | ||
636 | function EnumSessionsCallback(const lpThisSD: TDPSessionDesc2; |
690 | function EnumSessionsCallback(const lpThisSD: TDPSessionDesc2; |
637 | var lpdwTimeOut: DWORD; dwFlags: DWORD; lpContext: Pointer): BOOL; stdcall; |
691 | var lpdwTimeOut: DWORD; dwFlags: DWORD; lpContext: Pointer): BOOL; stdcall; |
638 | var |
692 | var |
639 | Guid: PGUID; |
693 | Guid: PGUID; |
640 | begin |
694 | begin |
641 | if dwFlags and DPESC_TIMEDOUT<>0 then |
695 | if dwFlags and DPESC_TIMEDOUT<>0 then |
642 | begin |
696 | begin |
643 | Result := False; |
697 | Result := False; |
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; |
656 | hr: HRESULT; |
713 | hr: HRESULT; |
657 | begin |
714 | begin |
658 | if FDPlay=nil then |
715 | if FDPlay=nil then |
659 | raise EDXPlayError.Create(SDXPlayNotConnectedNow); |
716 | raise EDXPlayError.Create(SDXPlayNotConnectedNow); |
660 | 717 | ||
661 | ClearSessionList; |
718 | ClearSessionList; |
662 | 719 | ||
663 | FillChar(dpDesc, SizeOf(dpDesc), 0); |
720 | FillChar(dpDesc, SizeOf(dpDesc), 0); |
664 | dpDesc.dwSize := SizeOf(dpDesc); |
721 | dpDesc.dwSize := SizeOf(dpDesc); |
665 | dpDesc.guidApplication := DXPlayStringToGUID(FGUID); |
722 | dpDesc.guidApplication := DXPlayStringToGUID(FGUID); |
666 | 723 | ||
667 | hr := FDPlay.EnumSessions(dpDesc, 0, @EnumSessionsCallback, FSessions, DPENUMSESSIONS_AVAILABLE); |
724 | hr := FDPlay.EnumSessions(dpDesc, 0, @EnumSessionsCallback, FSessions, DPENUMSESSIONS_AVAILABLE); |
668 | if hr=DPERR_USERCANCEL then Abort; |
725 | if hr=DPERR_USERCANCEL then Abort; |
669 | if hr<>0 then |
726 | if hr<>0 then |
670 | raise EDXPlayError.Create(SDXPlaySessionListCannotBeAcquired); |
727 | raise EDXPlayError.Create(SDXPlaySessionListCannotBeAcquired); |
671 | 728 | ||
672 | FReadSessioned := True; |
729 | FReadSessioned := True; |
673 | end; |
730 | end; |
674 | 731 | ||
675 | function TCustomDXPlay.GetSessionsPty: TStrings; |
732 | function TCustomDXPlay.GetSessionsPty: TStrings; |
676 | begin |
733 | begin |
677 | if not FReadSessioned then GetSessions; |
734 | if not FReadSessioned then GetSessions; |
678 | Result := FSessions; |
735 | Result := FSessions; |
679 | end; |
736 | end; |
680 | 737 | ||
681 | function TCustomDXPlay.GetProviderNameFromGUID(const ProviderGUID: TGUID): string; |
738 | function TCustomDXPlay.GetProviderNameFromGUID(const ProviderGUID: TGUID): string; |
682 | var |
739 | var |
683 | i: Integer; |
740 | i: Integer; |
684 | begin |
741 | begin |
685 | for i:=0 to Providers.Count-1 do |
742 | for i:=0 to Providers.Count-1 do |
686 | if CompareMem(PGUID(Providers.Objects[i]), @ProviderGUID, SizeOf(TGUID)) then |
743 | if CompareMem(PGUID(Providers.Objects[i]), @ProviderGUID, SizeOf(TGUID)) then |
687 | begin |
744 | begin |
688 | Result := Providers[i]; |
745 | Result := Providers[i]; |
689 | Exit; |
746 | Exit; |
690 | end; |
747 | end; |
691 | 748 | ||
692 | raise EDXPlayError.Create(SDXPlayProviderSpecifiedGUIDNotFound); |
749 | raise EDXPlayError.Create(SDXPlayProviderSpecifiedGUIDNotFound); |
693 | end; |
750 | end; |
694 | 751 | ||
695 | procedure TCustomDXPlay.CreateDPlayWithoutDialog(out DPlay: IDirectPlay4A; const ProviderName: string); |
752 | procedure TCustomDXPlay.CreateDPlayWithoutDialog(out DPlay: IDirectPlay4A; const ProviderName: string); |
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; |
720 | addressElements[dwElementCount].dwDataSize := SizeOf(TGUID); |
782 | addressElements[dwElementCount].dwDataSize := SizeOf(TGUID); |
721 | addressElements[dwElementCount].lpData := @ProviderGUID; |
783 | addressElements[dwElementCount].lpData := @ProviderGUID; |
722 | Inc(dwElementCount); |
784 | Inc(dwElementCount); |
723 | 785 | ||
724 | if CompareMem(@ProviderGUID, @DPSPGUID_MODEM, SizeOf(TGUID)) and ModemSetting.Enabled then |
786 | if CompareMem(@ProviderGUID, @DPSPGUID_MODEM, SizeOf(TGUID)) and ModemSetting.Enabled then |
725 | begin |
787 | begin |
726 | { Modem } |
788 | { Modem } |
727 | if ModemSetting.FModemName<>'' then |
789 | if ModemSetting.FModemName<>'' then |
728 | begin |
790 | begin |
729 | addressElements[dwElementCount].guidDataType := DPAID_Modem; |
791 | addressElements[dwElementCount].guidDataType := DPAID_Modem; |
730 | addressElements[dwElementCount].dwDataSize := Length(ModemSetting.FModemName)+1; |
792 | addressElements[dwElementCount].dwDataSize := Length(ModemSetting.FModemName)+1; |
731 | addressElements[dwElementCount].lpData := PChar(ModemSetting.FModemName); |
793 | addressElements[dwElementCount].lpData := PChar(ModemSetting.FModemName); |
732 | Inc(dwElementCount); |
794 | Inc(dwElementCount); |
733 | end; |
795 | end; |
734 | 796 | ||
735 | if ModemSetting.FPhoneNumber<>'' then |
797 | if ModemSetting.FPhoneNumber<>'' then |
736 | begin |
798 | begin |
737 | addressElements[dwElementCount].guidDataType := DPAID_Phone; |
799 | addressElements[dwElementCount].guidDataType := DPAID_Phone; |
738 | addressElements[dwElementCount].dwDataSize := Length(ModemSetting.FPhoneNumber)+1; |
800 | addressElements[dwElementCount].dwDataSize := Length(ModemSetting.FPhoneNumber)+1; |
739 | addressElements[dwElementCount].lpData := PChar(ModemSetting.FPhoneNumber); |
801 | addressElements[dwElementCount].lpData := PChar(ModemSetting.FPhoneNumber); |
740 | Inc(dwElementCount); |
802 | Inc(dwElementCount); |
741 | end; |
803 | end; |
742 | end else |
804 | end else |
743 | if CompareMem(@ProviderGUID, @DPSPGUID_TCPIP, SizeOf(TGUID)) and TCPIPSetting.Enabled then |
805 | if CompareMem(@ProviderGUID, @DPSPGUID_TCPIP, SizeOf(TGUID)) and TCPIPSetting.Enabled then |
744 | begin |
806 | begin |
745 | { TCP/IP } |
807 | { TCP/IP } |
746 | if TCPIPSetting.FHostName<>'' then |
808 | if TCPIPSetting.FHostName<>'' then |
747 | begin |
809 | begin |
748 | addressElements[dwElementCount].guidDataType := DPAID_INet; |
810 | addressElements[dwElementCount].guidDataType := DPAID_INet; |
749 | addressElements[dwElementCount].dwDataSize := Length(TCPIPSetting.FHostName)+1; |
811 | addressElements[dwElementCount].dwDataSize := Length(TCPIPSetting.FHostName)+1; |
750 | addressElements[dwElementCount].lpData := PChar(TCPIPSetting.FHostName); |
812 | addressElements[dwElementCount].lpData := PChar(TCPIPSetting.FHostName); |
751 | Inc(dwElementCount); |
813 | Inc(dwElementCount); |
752 | end; |
814 | end; |
753 | 815 | ||
754 | if TCPIPSetting.Port<>0 then |
816 | if TCPIPSetting.Port<>0 then |
755 | begin |
817 | begin |
756 | addressElements[dwElementCount].guidDataType := DPAID_INetPort; |
818 | addressElements[dwElementCount].guidDataType := DPAID_INetPort; |
757 | addressElements[dwElementCount].dwDataSize := SizeOf(TCPIPSetting.FPort); |
819 | addressElements[dwElementCount].dwDataSize := SizeOf(TCPIPSetting.FPort); |
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]); |
776 | try |
838 | try |
777 | { DirectPlay address initialization } |
839 | { DirectPlay address initialization } |
778 | if DPlay.InitializeConnection(lpAddress, 0)<>0 then |
840 | if DPlay.InitializeConnection(lpAddress, 0)<>0 then |
779 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
841 | raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]); |
780 | except |
842 | except |
781 | DPlay := nil; |
843 | DPlay := nil; |
782 | raise; |
844 | raise; |
783 | end; |
845 | end; |
784 | finally |
846 | finally |
785 | FreeMem(lpAddress); |
847 | FreeMem(lpAddress); |
786 | end; |
848 | end; |
787 | end; |
849 | end; |
788 | 850 | ||
789 | procedure TCustomDXPlay.ClearSessionList; |
851 | procedure TCustomDXPlay.ClearSessionList; |
790 | var |
852 | var |
791 | i: Integer; |
853 | i: Integer; |
792 | begin |
854 | begin |
793 | FReadSessioned := False; |
855 | FReadSessioned := False; |
794 | for i:=0 to FSessions.Count-1 do |
856 | for i:=0 to FSessions.Count-1 do |
795 | Dispose(PGUID(FSessions.Objects[i])); |
857 | Dispose(PGUID(FSessions.Objects[i])); |
796 | FSessions.Clear; |
858 | FSessions.Clear; |
797 | end; |
859 | end; |
798 | 860 | ||
799 | procedure TCustomDXPlay.Open; |
861 | procedure TCustomDXPlay.Open; |
800 | var |
862 | var |
801 | PlayerName: string; |
863 | PlayerName: string; |
802 | begin |
864 | begin |
803 | Close; |
865 | Close; |
804 | try |
866 | try |
805 | if not OpenDPlayWithLobby(PlayerName) then |
867 | if not OpenDPlayWithLobby(PlayerName) then |
806 | begin |
868 | begin |
807 | if not OpenDPlayWithoutLobby(PlayerName) then |
869 | if not OpenDPlayWithoutLobby(PlayerName) then |
808 | Abort; |
870 | Abort; |
809 | end; |
871 | end; |
810 | 872 | ||
811 | Open_(PlayerName); |
873 | Open_(PlayerName); |
812 | except |
874 | except |
813 | Close; |
875 | Close; |
814 | raise; |
876 | raise; |
815 | end; |
877 | end; |
816 | end; |
878 | end; |
817 | 879 | ||
818 | procedure TCustomDXPlay.Open2(NewSession: Boolean; const SessionName, PlayerName: string); |
880 | procedure TCustomDXPlay.Open2(NewSession: Boolean; const SessionName, PlayerName: string); |
819 | begin |
881 | begin |
820 | if not OpenDPlayWithoutLobby2(NewSession, ProviderName, SessionName, PlayerName) then |
882 | if not OpenDPlayWithoutLobby2(NewSession, ProviderName, SessionName, PlayerName) then |
821 | Abort; |
883 | Abort; |
822 | 884 | ||
823 | Open_(PlayerName); |
885 | Open_(PlayerName); |
824 | end; |
886 | end; |
825 | 887 | ||
826 | procedure TCustomDXPlay.Open_(NameS: string); |
888 | procedure TCustomDXPlay.Open_(NameS: string); |
827 | 889 | ||
828 | function EnumPlayersCallback2(TDPID: TDPID; dwPlayerType: DWORD; |
890 | function EnumPlayersCallback2(TDPID: TDPID; dwPlayerType: DWORD; |
829 | const lpName: TDPName; dwFlags: DWORD; lpContext: Pointer): BOOL; |
891 | const lpName: TDPName; dwFlags: DWORD; lpContext: Pointer): BOOL; |
830 | stdcall; |
892 | stdcall; |
831 | var |
893 | var |
832 | Player: TDXPlayPlayer; |
894 | Player: TDXPlayPlayer; |
833 | begin |
895 | begin |
834 | Player := TDXPlayPlayer.Create(TCustomDXPlay(lpContext).Players); |
896 | Player := TDXPlayPlayer.Create(TCustomDXPlay(lpContext).Players); |
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 | ||
847 | var |
914 | var |
848 | Name2: array[0..1023] of Char; |
915 | Name2: array[0..1023] of Char; |
849 | Name: TDPName; |
916 | Name: TDPName; |
850 | begin |
917 | begin |
851 | if FOpened then Close; |
918 | if FOpened then Close; |
852 | FOpened := True; |
919 | FOpened := True; |
853 | try |
920 | try |
854 | { Player making } |
921 | { Player making } |
855 | StrLCopy(@Name2, PChar(NameS), SizeOf(Name2)); |
922 | StrLCopy(@Name2, PChar(NameS), SizeOf(Name2)); |
856 | 923 | ||
857 | Name.lpszShortNameA := @Name2; |
924 | Name.lpszShortNameA := @Name2; |
858 | Name.lpszLongNameA := nil; |
925 | Name.lpszLongNameA := nil; |
859 | 926 | ||
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); |
875 | 942 | ||
876 | { Thread start } |
943 | { Thread start } |
877 | FRecvThread := TDXPlayRecvThread.Create(Self); |
944 | FRecvThread := TDXPlayRecvThread.Create(Self); |
878 | FRecvThread.Resume; |
945 | FRecvThread.Resume; |
879 | except |
946 | except |
880 | Close; |
947 | Close; |
881 | raise; |
948 | raise; |
882 | end; |
949 | end; |
883 | end; |
950 | end; |
884 | 951 | ||
885 | procedure TCustomDXPlay.ChangeDPlay; |
952 | procedure TCustomDXPlay.ChangeDPlay; |
886 | var |
953 | var |
887 | caps: TDPCAPS; |
954 | caps: TDPCAPS; |
888 | begin |
955 | begin |
889 | FAsyncSupported := False; |
956 | FAsyncSupported := False; |
890 | if FDPlay<>nil then |
957 | if FDPlay<>nil then |
891 | begin |
958 | begin |
892 | FillChar(caps, SizeOf(caps), 0); |
959 | FillChar(caps, SizeOf(caps), 0); |
893 | caps.dwSize := SizeOf(caps); |
960 | caps.dwSize := SizeOf(caps); |
894 | FDPlay.GetCaps(caps, 0); |
961 | FDPlay.GetCaps(caps, 0); |
895 | 962 | ||
896 | FAsyncSupported := caps.dwFlags and DPCAPS_ASYNCSUPPORTED<>0; |
963 | FAsyncSupported := caps.dwFlags and DPCAPS_ASYNCSUPPORTED<>0; |
897 | end; |
964 | end; |
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; |
923 | dwMaxPlayers := FMaxPlayers; |
994 | dwMaxPlayers := FMaxPlayers; |
924 | end; |
995 | end; |
925 | 996 | ||
926 | if Lobby.SetConnectionSettings(0, 0, ConnectionSettings^)<>0 then |
997 | if Lobby.SetConnectionSettings(0, 0, ConnectionSettings^)<>0 then |
927 | Exit; |
998 | Exit; |
928 | 999 | ||
929 | if Lobby.Connect(0, DPlay1, nil)<>0 then |
1000 | if Lobby.Connect(0, DPlay1, nil)<>0 then |
930 | Exit; |
1001 | Exit; |
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 | ||
949 | Result := True; |
1030 | Result := True; |
950 | end; |
1031 | end; |
951 | 1032 | ||
952 | function TCustomDXPlay.OpenDPlayWithoutLobby(out Name: string): Boolean; |
1033 | function TCustomDXPlay.OpenDPlayWithoutLobby(out Name: string): Boolean; |
953 | var |
1034 | var |
954 | Form: TDelphiXDXPlayForm; |
1035 | Form: TDelphiXDXPlayForm; |
955 | begin |
1036 | begin |
956 | Form := TDelphiXDXPlayForm.Create(Application); |
1037 | Form := TDelphiXDXPlayForm.Create(Application); |
957 | try |
1038 | try |
958 | Form.DXPlay := Self; |
1039 | Form.DXPlay := Self; |
959 | Form.ShowModal; |
1040 | Form.ShowModal; |
960 | 1041 | ||
961 | Result := Form.Tag<>0; |
1042 | Result := Form.Tag<>0; |
962 | 1043 | ||
963 | FDPlay := Form.DPlay; |
1044 | FDPlay := Form.DPlay; |
964 | ChangeDPlay; |
1045 | ChangeDPlay; |
965 | 1046 | ||
966 | Name := Form.PlayerName; |
1047 | Name := Form.PlayerName; |
967 | FProviderName := Form.ProviderName; |
1048 | FProviderName := Form.ProviderName; |
968 | FSessionName := Form.SessionName; |
1049 | FSessionName := Form.SessionName; |
969 | finally |
1050 | finally |
970 | Form.Free; |
1051 | Form.Free; |
971 | end; |
1052 | end; |
972 | end; |
1053 | end; |
973 | 1054 | ||
974 | function TCustomDXPlay.OpenDPlayWithoutLobby2(const NewSession: Boolean; |
1055 | function TCustomDXPlay.OpenDPlayWithoutLobby2(const NewSession: Boolean; |
975 | const ProviderName, SessionName, PlayerName: string): Boolean; |
1056 | const ProviderName, SessionName, PlayerName: string): Boolean; |
976 | var |
1057 | var |
977 | dpDesc: TDPSessionDesc2; |
1058 | dpDesc: TDPSessionDesc2; |
978 | i: Integer; |
1059 | i: Integer; |
979 | hr: HRESULT; |
1060 | hr: HRESULT; |
980 | begin |
1061 | begin |
981 | Result := False; |
1062 | Result := False; |
982 | 1063 | ||
983 | if FDPlay=nil then |
1064 | if FDPlay=nil then |
984 | raise EDXPlayError.Create(SDXPlayNotConnectedNow); |
1065 | raise EDXPlayError.Create(SDXPlayNotConnectedNow); |
985 | 1066 | ||
986 | if SessionName='' then |
1067 | if SessionName='' then |
987 | raise EDXPlayError.Create(SDXPlaySessionNameIsNotSpecified); |
1068 | raise EDXPlayError.Create(SDXPlaySessionNameIsNotSpecified); |
988 | 1069 | ||
989 | if PlayerName='' then |
1070 | if PlayerName='' then |
990 | raise EDXPlayError.Create(SDXPlayPlayerNameIsNotSpecified); |
1071 | raise EDXPlayError.Create(SDXPlayPlayerNameIsNotSpecified); |
991 | 1072 | ||
992 | if NewSession then |
1073 | if NewSession then |
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; |
1004 | if hr<>0 then |
1089 | if hr<>0 then |
1005 | raise EDXPlayError.CreateFmt(SDXPlaySessionCannotOpened, [FSessionName]); |
1090 | raise EDXPlayError.CreateFmt(SDXPlaySessionCannotOpened, [FSessionName]); |
1006 | end else |
1091 | end else |
1007 | begin |
1092 | begin |
1008 | { Session connection } |
1093 | { Session connection } |
1009 | { Enum session } |
1094 | { Enum session } |
1010 | i := Sessions.IndexOf(SessionName); |
1095 | i := Sessions.IndexOf(SessionName); |
1011 | if i=-1 then raise EDXPlayError.CreateFmt(SDXPlaySessionNotFound, [SessionName]); |
1096 | if i=-1 then raise EDXPlayError.CreateFmt(SDXPlaySessionNotFound, [SessionName]); |
1012 | 1097 | ||
1013 | FillChar(dpDesc, SizeOf(dpDesc), 0); |
1098 | FillChar(dpDesc, SizeOf(dpDesc), 0); |
1014 | dpDesc.dwSize := SizeOf(dpDesc); |
1099 | dpDesc.dwSize := SizeOf(dpDesc); |
1015 | dpDesc.guidInstance := PGUID(Sessions.Objects[i])^; |
1100 | dpDesc.guidInstance := PGUID(Sessions.Objects[i])^; |
1016 | dpDesc.guidApplication := DXPlayStringToGUID(GUID); |
1101 | dpDesc.guidApplication := DXPlayStringToGUID(GUID); |
1017 | 1102 | ||
1018 | hr := FDPlay.Open(dpDesc, DPOPEN_JOIN); |
1103 | hr := FDPlay.Open(dpDesc, DPOPEN_JOIN); |
1019 | if hr=DPERR_USERCANCEL then Exit; |
1104 | if hr=DPERR_USERCANCEL then Exit; |
1020 | if hr<>0 then |
1105 | if hr<>0 then |
1021 | raise EDXPlayError.CreateFmt(SDXPlaySessionCannotOpened, [FSessionName]); |
1106 | raise EDXPlayError.CreateFmt(SDXPlaySessionCannotOpened, [FSessionName]); |
1022 | end; |
1107 | end; |
1023 | 1108 | ||
1024 | Result := True; |
1109 | Result := True; |
1025 | 1110 | ||
1026 | FSessionName := SessionName; |
1111 | FSessionName := SessionName; |
1027 | end; |
1112 | end; |
1028 | 1113 | ||
1029 | procedure TCustomDXPlay.Close; |
1114 | procedure TCustomDXPlay.Close; |
1030 | begin |
1115 | begin |
1031 | FOpened := False; |
1116 | FOpened := False; |
1032 | FReadSessioned := False; |
1117 | FReadSessioned := False; |
1033 | 1118 | ||
1034 | try |
1119 | try |
1035 | if FCalledDoOpen then |
1120 | if FCalledDoOpen then |
1036 | begin |
1121 | begin |
1037 | FCalledDoOpen := False; |
1122 | FCalledDoOpen := False; |
1038 | DoClose; |
1123 | DoClose; |
1039 | end; |
1124 | end; |
1040 | finally |
1125 | finally |
1041 | if FDPlay<>nil then |
1126 | if FDPlay<>nil then |
1042 | begin |
1127 | begin |
1043 | if FLocalPlayer<>nil then FDPlay.DestroyPlayer(FLocalPlayer.FID); |
1128 | if FLocalPlayer<>nil then FDPlay.DestroyPlayer(FLocalPlayer.FID); |
1044 | FDPlay.Close; |
1129 | FDPlay.Close; |
1045 | end; |
1130 | end; |
1046 | 1131 | ||
1047 | FProviderName := ''; |
1132 | FProviderName := ''; |
1048 | FSessionName := ''; |
1133 | FSessionName := ''; |
1049 | FAsyncSupported := False; |
1134 | FAsyncSupported := False; |
1050 | 1135 | ||
1051 | ClearSessionList; |
1136 | ClearSessionList; |
1052 | 1137 | ||
1053 | FDPlay := nil; |
1138 | FDPlay := nil; |
1054 | ChangeDPlay; |
1139 | ChangeDPlay; |
1055 | 1140 | ||
1056 | if FInThread then |
1141 | if FInThread then |
1057 | SetEvent(FRecvEvent[1]) |
1142 | SetEvent(FRecvEvent[1]) |
1058 | else |
1143 | else |
1059 | FRecvThread.Free; |
1144 | FRecvThread.Free; |
1060 | 1145 | ||
1061 | CloseHandle(FRecvEvent[0]); FRecvEvent[0] := 0; |
1146 | CloseHandle(FRecvEvent[0]); FRecvEvent[0] := 0; |
1062 | 1147 | ||
1063 | FPlayers.Clear; |
1148 | FPlayers.Clear; |
1064 | 1149 | ||
1065 | FLocalPlayer := nil; |
1150 | FLocalPlayer := nil; |
1066 | end; |
1151 | end; |
1067 | end; |
1152 | end; |
1068 | 1153 | ||
1069 | procedure TCustomDXPlay.SendMessage(ToID: TDPID; Data: Pointer; DataSize: Integer); |
1154 | procedure TCustomDXPlay.SendMessage(ToID: TDPID; Data: Pointer; DataSize: Integer); |
1070 | begin |
1155 | begin |
1071 | if not Opened then Exit; |
1156 | if not Opened then Exit; |
1072 | 1157 | ||
1073 | if DataSize<SizeOf(TDPMSG_GENERIC) then |
1158 | if DataSize<SizeOf(TDPMSG_GENERIC) then |
1074 | raise EDXPlayError.Create(SDXPlayMessageIllegal); |
1159 | raise EDXPlayError.Create(SDXPlayMessageIllegal); |
1075 | 1160 | ||
1076 | if ToID=FLocalPlayer.ID then |
1161 | if ToID=FLocalPlayer.ID then |
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; |
1088 | dwFlags: DWORD): DWORD; |
1173 | dwFlags: DWORD): DWORD; |
1089 | begin |
1174 | begin |
1090 | if not Opened then Exit; |
1175 | if not Opened then Exit; |
1091 | 1176 | ||
1092 | if DataSize<SizeOf(TDPMSG_GENERIC) then |
1177 | if DataSize<SizeOf(TDPMSG_GENERIC) then |
1093 | raise EDXPlayError.Create(SDXPlayMessageIllegal); |
1178 | raise EDXPlayError.Create(SDXPlayMessageIllegal); |
1094 | 1179 | ||
1095 | Result := 0; |
1180 | Result := 0; |
1096 | if ToID=FLocalPlayer.ID then |
1181 | if ToID=FLocalPlayer.ID then |
1097 | begin |
1182 | begin |
1098 | { ©ª¶ÌbZ[W } |
1183 | { ©ª¶ÌbZ[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µÈ¢foCX éÌÅgíÈ¢ |
1187 | 0, 0, nil, @Result); // 0 ÈOÍT|[gµÈ¢foCX éÌÅ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 |
1107 | if Value<>FGUID then |
1192 | if Value<>FGUID then |
1108 | begin |
1193 | begin |
1109 | if Value='' then |
1194 | if Value='' then |
1110 | begin |
1195 | begin |
1111 | FGUID := GUIDToString(GUID_NULL); |
1196 | FGUID := GUIDToString(GUID_NULL); |
1112 | end else |
1197 | end else |
1113 | begin |
1198 | begin |
1114 | FGUID := GUIDToString(DXPlayStringToGUID(Value)); |
1199 | FGUID := GUIDToString(DXPlayStringToGUID(Value)); |
1115 | end; |
1200 | end; |
1116 | end; |
1201 | end; |
1117 | end; |
1202 | end; |
1118 | 1203 | ||
1119 | procedure TCustomDXPlay.SetModemSetting(Value: TDXPlayModemSetting); |
1204 | procedure TCustomDXPlay.SetModemSetting(Value: TDXPlayModemSetting); |
1120 | begin |
1205 | begin |
1121 | FModemSetting.Assign(Value); |
1206 | FModemSetting.Assign(Value); |
1122 | end; |
1207 | end; |
1123 | 1208 | ||
1124 | procedure TCustomDXPlay.SetProviderName(const Value: string); |
1209 | procedure TCustomDXPlay.SetProviderName(const Value: string); |
1125 | begin |
1210 | begin |
1126 | Close; |
1211 | Close; |
1127 | FProviderName := Value; |
1212 | FProviderName := Value; |
1128 | if FProviderName='' then Exit; |
1213 | if FProviderName='' then Exit; |
1129 | try |
1214 | try |
1130 | CreateDPlayWithoutDialog(FDPlay, Value); |
1215 | CreateDPlayWithoutDialog(FDPlay, Value); |
1131 | except |
1216 | except |
1132 | FProviderName := ''; |
1217 | FProviderName := ''; |
1133 | raise; |
1218 | raise; |
1134 | end; |
1219 | end; |
1135 | end; |
1220 | end; |
1136 | 1221 | ||
1137 | procedure TCustomDXPlay.SetTCPIPSetting(Value: TDXPlayTCPIPSetting); |
1222 | procedure TCustomDXPlay.SetTCPIPSetting(Value: TDXPlayTCPIPSetting); |
1138 | begin |
1223 | begin |
1139 | FTCPIPSetting.Assign(Value); |
1224 | FTCPIPSetting.Assign(Value); |
1140 | end; |
1225 | end; |
1141 | 1226 | ||
1142 | initialization |
1227 | initialization |
1143 | CoInitialize(nil); |
1228 | CoInitialize(nil); |
1144 | finalization |
1229 | finalization |
1145 | CoUninitialize; |
1230 | CoUninitialize; |
1146 | end. |
1231 | end. |
1147 | - |