COMM.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

  1.  /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File:       comm.c
  6.  *  Content:    DirectPlay related code
  7.  *
  8.  *
  9.  ***************************************************************************/
  10. #include "comm.h"
  11. #include "lobby.h"
  12. /*
  13.  * Externals
  14.  */
  15. extern LPGUID glpGuid; // duel's guid
  16. extern LPDPLCONNECTION glpdplConnection; // connection settings
  17. /*
  18.  * Globals
  19.  */
  20. LPDPSESSIONDESC2 glpdpSD; // current session description
  21. LPDIRECTPLAY2 glpDP = NULL; // directplay object pointer
  22. LPDIRECTPLAY3A glpDP3A = NULL;
  23. /*
  24.  * DPlayClose
  25.  *
  26.  * Wrapper for DirectPlay Close API
  27.  */
  28. HRESULT DPlayClose(void)
  29. {
  30. HRESULT hr=E_FAIL;
  31. if (glpDP) 
  32. hr = IDirectPlay2_Close(glpDP);
  33. return hr;
  34. }
  35. /*
  36.  * DPlayCreate
  37.  *
  38.  * Wrapper for DirectPlay Create API. Retrieves a DirectPlay2/DirectPlay2A interface
  39.  * based on the UNICODE flag
  40.  * 
  41.  */
  42. HRESULT DPlayCreate(LPVOID lpCon)
  43. {
  44. HRESULT hr = E_FAIL;
  45. LPDIRECTPLAY3 lpDP3 = NULL;
  46. hr = CoCreateInstance( &CLSID_DirectPlay, NULL, CLSCTX_INPROC_SERVER,
  47. &IID_IDirectPlay3A, (LPVOID *) &glpDP3A );
  48. if ( DP_OK == hr )
  49. {
  50. if (lpCon)
  51. {
  52. hr = IDirectPlay3_InitializeConnection( glpDP3A, lpCon, 0);
  53. }
  54. // query for a DirectPlay2(A) interface
  55. #ifdef UNICODE
  56. hr = IDirectPlay_QueryInterface(glpDP3A,&IID_IDirectPlay2,(LPVOID *)&glpDP);
  57. #else
  58. hr = IDirectPlay_QueryInterface(glpDP3A,&IID_IDirectPlay2A,(LPVOID *)&glpDP);
  59. #endif
  60. }
  61. return hr;
  62. }
  63. /*
  64.  * DPlayCreatePlayer
  65.  *
  66.  * Wrapper for DirectPlay CreatePlayer API. 
  67.  */
  68. HRESULT DPlayCreatePlayer(LPDPID lppidID, LPTSTR lptszPlayerName, HANDLE hEvent, 
  69.   LPVOID lpData, DWORD dwDataSize)
  70. {
  71. HRESULT hr=E_FAIL;
  72. DPNAME name;
  73. ZeroMemory(&name,sizeof(name));
  74. name.dwSize = sizeof(DPNAME);
  75. #ifdef UNICODE
  76. name.lpszShortName = lptszPlayerName;
  77. #else
  78. name.lpszShortNameA = lptszPlayerName;
  79. #endif
  80. if (glpDP)
  81. hr = IDirectPlay2_CreatePlayer(glpDP, lppidID, &name, hEvent, lpData, 
  82.   dwDataSize, 0);
  83. return hr;
  84. }
  85. /*
  86.  * DPlayCreateSession
  87.  *
  88.  * Wrapper for DirectPlay CreateSession API.Uses the global application guid (glpGuid).
  89.  */
  90. HRESULT DPlayCreateSession(LPTSTR lptszSessionName)
  91. {
  92. HRESULT hr = E_FAIL;
  93. DPSESSIONDESC2 dpDesc;
  94.     ZeroMemory(&dpDesc, sizeof(dpDesc));
  95.     dpDesc.dwSize = sizeof(dpDesc);
  96. dpDesc.dwFlags = DPSESSION_MIGRATEHOST | DPSESSION_KEEPALIVE;
  97. #ifdef UNICODE
  98. dpDesc.lpszSessionName = lptszSessionName;
  99. #else
  100. dpDesc.lpszSessionNameA = lptszSessionName;
  101. #endif
  102. // set the application guid
  103. if (glpGuid)
  104. dpDesc.guidApplication = *glpGuid;
  105. if (glpDP)
  106. hr = IDirectPlay2_Open(glpDP, &dpDesc, DPOPEN_CREATE);
  107. return hr;
  108. }
  109. /*
  110.  * DPlayDestroyPlayer
  111.  * 
  112.  * Wrapper for DirectPlay DestroyPlayer API. 
  113.  */
  114. HRESULT DPlayDestroyPlayer(DPID pid)
  115. {
  116. HRESULT hr=E_FAIL;
  117.     if (glpDP)
  118. hr = IDirectPlay2_DestroyPlayer(glpDP, pid);
  119. return hr;
  120. }
  121. /*
  122.  * DPlayEnumPlayers
  123.  *
  124.  * Wrapper for DirectPlay API EnumPlayers
  125.  */
  126. HRESULT DPlayEnumPlayers(LPGUID lpSessionGuid, LPDPENUMPLAYERSCALLBACK2 lpEnumCallback, 
  127.  LPVOID lpContext, DWORD dwFlags)
  128. {
  129. HRESULT hr=E_FAIL;
  130. if (glpDP)
  131. hr = IDirectPlay2_EnumPlayers(glpDP, lpSessionGuid, lpEnumCallback, lpContext, dwFlags);
  132. return hr;
  133. }
  134. /*
  135.  * DPlayEnumSessions
  136.  *
  137.  * Wrapper for DirectPlay EnumSessions API.
  138.  */
  139. HRESULT DPlayEnumSessions(DWORD dwTimeout, LPDPENUMSESSIONSCALLBACK2 lpEnumCallback, 
  140.   LPVOID lpContext, DWORD dwFlags)
  141. {
  142. HRESULT hr = E_FAIL;
  143.     DPSESSIONDESC2 dpDesc;
  144. ZeroMemory(&dpDesc, sizeof(dpDesc));
  145. dpDesc.dwSize = sizeof(dpDesc);
  146. if (glpGuid)
  147. dpDesc.guidApplication = *glpGuid;
  148. if (glpDP)
  149. hr = IDirectPlay2_EnumSessions(glpDP, &dpDesc, dwTimeout, lpEnumCallback,
  150. lpContext, dwFlags);
  151. return hr;
  152. }
  153. /*
  154.  * DPlayGetPlayerData
  155.  * 
  156.  * Wrapper for DirectPlay GetPlayerData API.
  157.  */
  158. HRESULT DPlayGetPlayerData(DPID pid, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags)
  159. {
  160. HRESULT hr=E_FAIL;
  161. if (glpDP) 
  162. hr = IDirectPlay2_GetPlayerData(glpDP, pid, lpData, lpdwDataSize, dwFlags);
  163. return hr;
  164. }
  165. /*
  166.  * DPlayGetSessionDesc
  167.  *
  168.  * Wrapper for DirectPlay GetSessionDesc API. 
  169.  */
  170. HRESULT DPlayGetSessionDesc(void)
  171. {
  172. HRESULT hr=E_FAIL;
  173. DWORD dwSize;
  174. // free old session desc, if any
  175. if (glpdpSD)
  176. {
  177. free(glpdpSD);
  178. glpdpSD = NULL;
  179. }
  180. if (glpDP)
  181. {
  182. // first get the size for the session desc
  183. if ((hr = IDirectPlay2_GetSessionDesc(glpDP, NULL, &dwSize)) == DPERR_BUFFERTOOSMALL)
  184. {
  185. // allocate memory for it
  186. glpdpSD = (LPDPSESSIONDESC2) malloc(dwSize);
  187. if (glpdpSD)
  188. {
  189. // now get the session desc
  190. hr = IDirectPlay2_GetSessionDesc(glpDP, glpdpSD, &dwSize);
  191. }
  192. else
  193. {
  194. hr = E_OUTOFMEMORY;
  195. }
  196. }
  197. }
  198. return hr;
  199. }
  200. /*
  201.  * IsDPlay
  202.  *
  203.  * Returns TRUE if a DirectPlay interface exists, otherwise FALSE.
  204.  */
  205. BOOL IsDPlay(void)
  206. {
  207. return (glpDP ? TRUE:FALSE);
  208. }
  209. /*
  210.  * DPlayOpenSession
  211.  *
  212.  * Wrapper for DirectPlay OpenSession API. 
  213.  */
  214. HRESULT DPlayOpenSession(LPGUID lpSessionGuid)
  215. {
  216. HRESULT hr = E_FAIL;
  217. DPSESSIONDESC2 dpDesc;
  218.     ZeroMemory(&dpDesc, sizeof(dpDesc));
  219.     dpDesc.dwSize = sizeof(dpDesc);
  220. // set the session guid
  221. if (lpSessionGuid)
  222. dpDesc.guidInstance = *lpSessionGuid;
  223. // set the application guid
  224. if (glpGuid)
  225. dpDesc.guidApplication = *glpGuid;
  226. // open it
  227. if (glpDP)
  228. hr = IDirectPlay2_Open(glpDP, &dpDesc, DPOPEN_JOIN);
  229. return hr;
  230. }
  231. /*
  232.  * DPlayReceive
  233.  *
  234.  * Wrapper for DirectPlay Receive API
  235.  */
  236. HRESULT DPlayReceive(LPDPID lpidFrom, LPDPID lpidTo, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize)
  237. {
  238. HRESULT hr = E_FAIL;
  239. if (glpDP)
  240. hr = IDirectPlay2_Receive(glpDP, lpidFrom, lpidTo, dwFlags, lpData, lpdwDataSize);
  241. return hr;
  242. }
  243. /*
  244.  * DPlayRelease
  245.  *
  246.  * Wrapper for DirectPlay Release API.
  247.  */
  248. HRESULT DPlayRelease(void)
  249. {
  250. HRESULT hr = E_FAIL;
  251. if (glpDP)
  252. {
  253. // free session desc, if any
  254. if (glpdpSD) 
  255. {
  256. free(glpdpSD);
  257. glpdpSD = NULL;
  258. }
  259. // free connection settings structure, if any (lobby stuff)
  260. if (glpdplConnection)
  261. {
  262. free(glpdplConnection);
  263. glpdplConnection = NULL;
  264. }
  265. // release dplay
  266. hr = IDirectPlay2_Release(glpDP);
  267. glpDP = NULL;
  268. }
  269. if (glpDP3A)
  270. {
  271. hr = IDirectPlay3_Release(glpDP3A);
  272. glpDP3A = NULL;
  273. }
  274. return hr;
  275. }
  276. /*
  277.  * DPlaySend
  278.  * 
  279.  * Wrapper for DirectPlay Send API.
  280.  */
  281. HRESULT DPlaySend(DPID idFrom, DPID idTo, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize)
  282. {
  283. HRESULT hr = E_FAIL;
  284. if (glpDP)
  285. hr = IDirectPlay2_Send(glpDP, idFrom, idTo, dwFlags, lpData, dwDataSize);
  286. return hr;
  287. }
  288. /*
  289.  * DPlaySetPlayerData
  290.  *
  291.  * Wrapper for DirectPlay SetPlayerData API
  292.  */
  293. HRESULT DPlaySetPlayerData(DPID pid, LPVOID lpData, DWORD dwSize, DWORD dwFlags)
  294. {
  295. HRESULT hr=E_FAIL;
  296. if (glpDP)
  297. hr = IDirectPlay2_SetPlayerData(glpDP, pid, lpData, dwSize, dwFlags);
  298. return hr;
  299. }