Platform SDK: DirectX |
This tutorial pertains only to applications written in C++. See DirectPlay Visual Basic Tutorials.
If the user wants to join an existing session, enumerate the available sessions by using the IDirectPlay4::EnumSessions method, present the choices to the user, and then connect to that session by using the IDirectPlay4::Open method, specifying the DPOPEN_JOIN flag. The service provider might display a dialog box requesting some information from the user before it can enumerate the sessions.
See Tutorial 4 for details on the asynchronous EnumSessions functionality.
The following example shows how to enumerate the available sessions:
// Enum sessions and let DirectPlay decide the timeout. ZeroMemory( &dpsd, sizeof(dpsd) ); dpsd.dwSize = sizeof(dpsd); dpsd.guidApplication = g_AppGUID; // Enumerate all the active DirectPlay games // on the selected connection. hr = g_pDP->EnumSessions( &dpsd, 0, DPConnect_EnumSessionsCallback, NULL, DPENUMSESSIONS_ALL | DPENUMSESSIONS_ASYNC );
The third parameter in the IDirectPlay4::EnumSessions method is a callback that enumerates the available sessions. The following code shows how the SimpleConnect Sample implements this callback function:
BOOL FAR PASCAL DPConnect_EnumSessionsCallback( LPCDPSESSIONDESC2 pdpsd, DWORD* pdwTimeout, DWORD dwFlags, VOID* pvContext ) { DPSessionInfo* pDPSINew = NULL; if ( dwFlags & DPESC_TIMEDOUT ) return FALSE; // Timed out, so stop the enumeration. // Found a good session, save it. pDPSINew = new DPSessionInfo; if ( NULL == pDPSINew ) return FALSE; ZeroMemory( pDPSINew, sizeof(DPSessionInfo) ); // Copy the information into pDPSINew. pDPSINew->guidSession = pdpsd->guidInstance; sprintf( pDPSINew->szSession, "%s (%d/%d)", pdpsd->lpszSessionNameA, pdpsd->dwCurrentPlayers, pdpsd->dwMaxPlayers ); // Add pDPSINew to the circular linked list, g_pDPSIFirst. pDPSINew->pDPSINext = g_DPSIHead.pDPSINext; g_DPSIHead.pDPSINext = pDPSINew; return TRUE; }
After the user has selected a session, your application can allow the user to join an existing session. The following example shows how to join an existing session:
// Set up the DPSESSIONDESC2, and get the session GUID from // the selected listbox item. ZeroMemory( &dpsd, sizeof(dpsd) ); dpsd.dwSize = sizeof(dpsd); dpsd.guidInstance = pDPSISelected->guidSession; dpsd.guidApplication = g_AppGUID; // Join the session g_bHostPlayer = FALSE; if ( FAILED( hr = g_pDP->Open( &dpsd, DPOPEN_JOIN ) ) ) return hr;
Next: Step 4: Create a Session