⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winmain.cpp

📁 [游戏开发参考书-用DirectX编写RPG游戏]这是一个系列的丛书如果你都看并且懂的话你就可以你工作啦!
💻 CPP
字号:
/**************************************************
WinMain.cpp
Chapter 9 Enum Network Adapters Demo

Programming Role-Playing Games with DirectX
by Jim Adams (01 Jan 2002)

Required libraries:
  DPLAY.LIB, DPNET.LIB, and DXGUID.LIB
**************************************************/

#include <windows.h>

#include <dplay8.h>
#include <dpaddr.h>

#include "resource.h"

// Application variables ////////////////////////
HWND g_hWnd;                    // Window handle
char g_szClass[] = "EnumDemo";  // Class name

IDirectPlay8Client *g_pDPClient = NULL;    // DirectPlay Client
DPN_SERVICE_PROVIDER_INFO *g_pSPList = NULL; // SP list
DWORD g_dwNumSP = 0;                         // and count

// Application prototypes ///////////////////////
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev,          \
                   LPSTR szCmdLine, int nCmdShow);
long FAR PASCAL WindowProc(HWND hWnd, UINT uMsg,              \
                           WPARAM wParam, LPARAM lParam);

BOOL InitDP();
void ReleaseDP();
HRESULT WINAPI NetMsgHandler(PVOID pvUserContext,             \
                             DWORD dwMessageId,               \
                             PVOID pMsgBuffer);
void EnumSP();
void EnumAdapters(GUID *guidSP);

// Application //////////////////////////////////
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev,          \
                   LPSTR szCmdLine, int nCmdShow)
{
  WNDCLASS wc;
  MSG      Msg;

  // Register window class
  wc.style         = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc   = WindowProc;
  wc.cbClsExtra    = 0;
  wc.cbWndExtra    = DLGWINDOWEXTRA;
  wc.hInstance     = hInst;
  wc.hIcon         = LoadIcon(hInst, IDI_APPLICATION);
  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
  wc.lpszMenuName  = NULL;
  wc.lpszClassName = g_szClass;
  RegisterClass(&wc);

  CoInitialize(NULL);

  // Create the dialog box window and show it
  g_hWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_ENUM),     \
                        0, NULL);

  // Initialize DirectPlay and enumerate service providers
  if(InitDP() == TRUE)
    EnumSP();
  else {
    MessageBox(NULL, "Error initializing DirectPlay.",        \
               "ERROR", MB_OK | MB_ICONEXCLAMATION);
    return FALSE;
  }

  UpdateWindow(g_hWnd);
  ShowWindow(g_hWnd, nCmdShow);

  // Message loop
  while(GetMessage(&Msg, NULL, 0, 0)) {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
  }

  // Clean up
  UnregisterClass(g_szClass, hInst);

  CoUninitialize();

  return 0;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg,             \
                            WPARAM wParam, LPARAM lParam)
{
  unsigned int nSelected;
  DPN_SERVICE_PROVIDER_INFO *pSPPtr;

  switch(uMsg) {
    case WM_COMMAND:
      if(LOWORD(wParam) == IDC_SERVICEPROVIDERS &&            \
                           HIWORD(wParam) == LBN_SELCHANGE) {
        // Get the selection from the list
        nSelected = SendMessage(GetDlgItem(hWnd,              \
                  IDC_SERVICEPROVIDERS), LB_GETCURSEL, 0, 0);

        // Make sure it's valid and enumerate the adapters
        if(nSelected < g_dwNumSP) {
          pSPPtr = g_pSPList;
          pSPPtr += nSelected;
          EnumAdapters(&pSPPtr->guid);
        }
      }
      break;

    case WM_DESTROY:
      ReleaseDP();
      PostQuitMessage(0);
      break;

    default: return DefWindowProc(hWnd, uMsg, wParam, lParam);
  }

  return 0;
}

BOOL InitDP()
{
  // Create DirectPlay Client component
  if(FAILED(DirectPlay8Create(&IID_IDirectPlay8Client,        \
                              (void**)&g_pDPClient, NULL)))
    return FALSE;

  // Assign a message handler to network component
  if(FAILED(g_pDPClient->Initialize(NULL, NetMsgHandler, 0)))
    return FALSE;

  return TRUE;
}

void ReleaseDP()
{
  // Delete Client SP list memory
  delete[] g_pSPList;
  g_pSPList = NULL;
  g_dwNumSP = 0;

  // Release client component
  if(g_pDPClient != NULL) {
    g_pDPClient->Close(0);
    g_pDPClient->Release();
  }
  g_pDPClient = NULL;
}

HRESULT WINAPI NetMsgHandler(PVOID pvUserContext,             \
                             DWORD dwMessageId,               \
                             PVOID pMsgBuffer)
{
  // Return S_OK to signify the message was handled OK
  return S_OK;
}

void EnumSP()
{
  HWND hLB;
  DPN_SERVICE_PROVIDER_INFO *pSPPtr;
  DWORD dwSize = 0;
  DWORD i;
  char szName[1024];
  HRESULT hr;

  // Get a handle to the list box
  hLB = GetDlgItem(g_hWnd, IDC_SERVICEPROVIDERS);

  // Clear the list box
  SendMessage(hLB, LB_RESETCONTENT, 0, 0);

  // Release SP list memory
  delete[] g_pSPList;
  g_pSPList = NULL;
  g_dwNumSP = 0;

  // Return if no Server object
  if(g_pDPClient == NULL)
    return;

  // Query the required size of the data buffer
  hr = g_pDPClient->EnumServiceProviders(NULL,NULL,g_pSPList, \
                                     &dwSize, &g_dwNumSP, 0);
  if(hr != DPNERR_BUFFERTOOSMALL)
    return;

  // Allocate a buffer
  if((g_pSPList = (DPN_SERVICE_PROVIDER_INFO*)new             \
                                       BYTE[dwSize]) == NULL)
    return;

  // Enumerate again
  if(SUCCEEDED(g_pDPClient->EnumServiceProviders(NULL,NULL,   \
                       g_pSPList, &dwSize, &g_dwNumSP, 0))) {

    // Enumeration is complete, scan through entries
    pSPPtr = g_pSPList;
    for(i=0;i<g_dwNumSP;i++) {

      // Convert wide string into multi-byte string
      wcstombs(szName, pSPPtr->pwszName, 1024);

      // Add the service provider into box
      SendMessage(hLB, LB_ADDSTRING, 0, (LPARAM)szName);

      // Go to next service provider in buffer
      pSPPtr++;
    }
  }
}

void EnumAdapters(GUID *guidSP)
{
  HWND hLB;
  DPN_SERVICE_PROVIDER_INFO *pAdapterList = NULL;
  DPN_SERVICE_PROVIDER_INFO *pAdapterPtr;
  DWORD dwNumAdapters = 0;
  DWORD dwSize = 0;
  DWORD i;
  char szName[1024];
  HRESULT hr;

  // Get a handle to the list box
  hLB = GetDlgItem(g_hWnd, IDC_ADAPTERS);

  // Clear the list box
  SendMessage(hLB, LB_RESETCONTENT, 0, 0);

  // Return if no Server object or GUID
  if(g_pDPClient == NULL || guidSP == NULL)
    return;

  // Query the required size of the data buffer
  hr = g_pDPClient->EnumServiceProviders(guidSP, NULL,        \
                    pAdapterList, &dwSize, &dwNumAdapters, 0);
  if(hr != DPNERR_BUFFERTOOSMALL)
    return;

  // Allocate a buffer
  if((pAdapterList = (DPN_SERVICE_PROVIDER_INFO*)new          \
                                        BYTE[dwSize]) == NULL)
    return;

  // Enumerate again
  if(SUCCEEDED(g_pDPClient->EnumServiceProviders(guidSP,NULL, \
                pAdapterList, &dwSize, &dwNumAdapters, 0))) {

    // Enumeration is complete, scan through entries
    pAdapterPtr = pAdapterList;
    for(i=0;i<dwNumAdapters;i++) {

      // Convert wide string into multi-byte string
      wcstombs(szName, pAdapterPtr->pwszName, 1024);

      // Add the service provider into box
      SendMessage(hLB, LB_ADDSTRING, 0, (LPARAM)szName);

      // Go to next service provider in buffer
      pAdapterPtr++;
    }
  }

  // Delete the list memory resources
  delete[] pAdapterList;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -