DirectX SDK

Step 2: Enumerate and Initialize the Service Providers

[Visual Basic]

This tutorial pertains only to applications written in C++. See DirectPlay Visual Basic Tutorials.

[C++]

The next step in creating a manual connection is to request that the user select a communication medium for the application. Your application can identify the service providers installed on a personal computer by using the EnumConnections method.

The following example shows how to enumerate the service providers:

// Enumerate all DirectPlay connections and store them 
// in the listbox
if ( FAILED( hr = pDP->EnumConnections( &g_AppGUID, 
        DPConnect_EnumConnectionsCallback, hWndListBox, 0 ) ) )
{
    SAFE_RELEASE( pDP );
    return hr;
}

The second parameter in the EnumConnections method is a callback that enumerates service providers registered with DirectPlay. The following example shows how the SimpleConnect Sample implements this callback function:

BOOL FAR PASCAL DPConnect_EnumConnectionsCallback( 
        LPCGUID   pguidSP,
        VOID*     pConnection,
        DWORD     dwConnectionSize,
        LPCDPNAME pName,
        DWORD     dwFlags,
        VOID*     pvContext )
{
    HRESULT       hr;
    LPDIRECTPLAY4 pDP = NULL;
    VOID*         pConnectionBuffer = NULL;
    HWND          hWndListBox = (HWND)pvContext;
    LRESULT       iIndex;
 
    // Create a IDirectPlay object.
    if ( FAILED( hr = CoCreateInstance( CLSID_DirectPlay, NULL,
            CLSCTX_ALL, IID_IDirectPlay4A, (VOID**)&pDP ) ) )
            return FALSE; // Error, stop enumerating
 
    // Test the if the connection is available 
    // by attempting to initialize.
        // the connection
    if( FAILED( hr = pDP->InitializeConnection( pConnection, 0 ) ) )
    {
        SAFE_RELEASE( pDP );
        return TRUE; // Unavailable connection, keep enumerating
    }
 
    // Don't need the IDirectPlay interface any more, so release it.
    SAFE_RELEASE( pDP );
 
    // Found a good connection, so put it in the listbox.
    iIndex = SendMessage( hWndListBox, LB_ADDSTRING, 0,
            (LPARAM)pName->lpszShortNameA );
    if( iIndex == CB_ERR )
        return FALSE; // Error, stop enumerating
 
    pConnectionBuffer = new BYTE[ dwConnectionSize ];
    if( pConnectionBuffer == NULL )
        return FALSE; // Error, stop enumerating
 
    // Store pointer to GUID in listbox.
    memcpy( pConnectionBuffer, pConnection, dwConnectionSize );
    SendMessage( hWndListBox, LB_SETITEMDATA, iIndex,
            (LPARAM)pConnectionBuffer );
 
    return TRUE; // Keep enumerating
}

Once the user selects which connection to use, you need to retrieve the connection data that comes back with the enumeration, and initialize the DirectPlay object with this data.

if ( FAILED( hr = g_pDP->InitializeConnection( pConnection, 0 ) ) )
    return hr;

Next: Step 3: Join a Session