亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? winmain.cpp

?? 用DirectX編寫RPG游戲-Programming.Role.Playing.Games.with.DirectX
?? CPP
字號:
/**************************************************
WinMain.cpp
Chapter 9 Server Network 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 <stdio.h>

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

#include "resource.h"

// Application variables ////////////////////////
typedef struct sPlayerInfo {
  DPNID dpnidPlayerId;  // DirectPlay Player ID #
  char  szName[256];    // Player Name

  sPlayerInfo() { dpnidPlayerId = 0; }
} sPlayerInfo;

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

// Aplication GUID
GUID g_ApplicationGUID = { 0xababbe60, 0x1ac0, 0x11d5,        \
             { 0x90, 0x89, 0x44, 0x45, 0x53, 0x54, 0x0, 0x1 }
                         };

IDirectPlay8Server *g_pDPServer = NULL;  // DirectPlay Server
DPN_SERVICE_PROVIDER_INFO *g_pAdapterList = NULL; // Adapters
DWORD g_dwNumAdapters = 0;                       // # Adapters

sPlayerInfo Players[256];  // Maximum # of players

BOOL g_Hosting = FALSE;  // Flag is host started or not

// 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);
BOOL StartSession(GUID *guidAdapter);
void StopSession();
void EnumAdapters();
void SendTextMsg(DPNID dpnidPlayer, char *Text);

// 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 TCP/IP adapters
  if(InitDP() == TRUE) {
    EnumAdapters();
  } else {
    MessageBox(g_hWnd, "Error initializing DirectPlay.",      \
                        "ERROR", MB_OK | MB_ICONEXCLAMATION);
    UnregisterClass(g_szClass, hInst);
    CoUninitialize();
    return FALSE;
  }

  // Make sure there's an adapter to use
  if(!g_dwNumAdapters) {
    MessageBox(g_hWnd, "There's no TCP/IP adapters to use!",  \
                       "ERROR", MB_OK | MB_ICONEXCLAMATION);
    UnregisterClass(g_szClass, hInst);
    CoUninitialize();
    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, i;
  char         szName[256];
  DPN_SERVICE_PROVIDER_INFO *pAdapterPtr;

  switch(uMsg) {
    case WM_COMMAND:
  
      switch(LOWORD(wParam)) {
  
        case IDC_STARTSTOP:
          if(g_Hosting == FALSE) {
            // Get adapter to use
            if((nSelected = SendMessage(GetDlgItem(hWnd,      \
                IDC_ADAPTERS), CB_GETCURSEL, 0, 0)) == LB_ERR)
              break;

            // Make sure it's valid and start session
            if(nSelected < g_dwNumAdapters) {
              pAdapterPtr = g_pAdapterList;
              pAdapterPtr += nSelected;
              if(StartSession(&pAdapterPtr->guid) == FALSE)
                MessageBox(hWnd, "Unable to start server!",   \
                         "Error", MB_OK | MB_ICONEXCLAMATION);
            }
          } else
            StopSession();
          break;

        case IDC_DISCONNECT:
            // Make sure we're hosting
          if(g_Hosting == TRUE) {

            // Get user from list to disconnect
            nSelected = SendMessage(GetDlgItem(hWnd,          \
                             IDC_USERS), LB_GETCURSEL, 0, 0);
            if(nSelected != LB_ERR) {
              // Find the player in list
              SendMessage(GetDlgItem(hWnd, IDC_USERS),        \
                      LB_GETTEXT, nSelected, (LPARAM)szName);

              for(i=0;i<256;i++) {
                if(Players[i].dpnidPlayerId != 0 &&           \
                        !strcmp(Players[i].szName, szName)) {
                  // Disconnect them
                  g_pDPServer->DestroyClient(                 \
                       Players[i].dpnidPlayerId, NULL, 0, 0);
                  break;
                }
              }
            }
          }

          break;
      }
      break;

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

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

  return 0;
}

BOOL InitDP()
{
  // Create DirectPlay Server component
  if(FAILED(DirectPlay8Create(&IID_IDirectPlay8Server,        \
                              (void**)&g_pDPServer, NULL)))
    return FALSE;

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

  return TRUE;
}

void ReleaseDP()
{
  // Delete Server adapter list memory
  delete[] g_pAdapterList;
  g_pAdapterList = NULL;
  g_dwNumAdapters = 0;

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

BOOL StartSession(GUID *guidAdapter)
{
  DPN_APPLICATION_DESC dpad;
  IDirectPlay8Address *pDPAddress;
  DWORD dwPort;

  // Make sure there's an adapter
  if(guidAdapter == NULL)
    return FALSE;

  // Need to re-assign a network handler as quitting a previous
  // session clears it. Close the connection first before
  // assigning a new network handler.
  g_pDPServer->Close(0);
  if(FAILED(g_pDPServer->Initialize(NULL, NetMsgHandler, 0)))
    return FALSE;

  // Create an address object and fill it with information
  if(FAILED(DirectPlay8AddressCreate(                         \
                              &IID_IDirectPlay8Address,       \
                              (void**)&pDPAddress, NULL)))
    return FALSE;

  // Set the protocol to TCP/IP
  if(FAILED(pDPAddress->SetSP(&CLSID_DP8SP_TCPIP))) {
    pDPAddress->Release();
    return FALSE;
  }

  // Set the port
  dwPort = 21234;
  if(FAILED(pDPAddress->AddComponent(DPNA_KEY_PORT, &dwPort,  \
                      sizeof(DWORD), DPNA_DATATYPE_DWORD))) {
    pDPAddress->Release();
    return FALSE;
  }

  // Set the adapter
  if(FAILED(pDPAddress->AddComponent(DPNA_KEY_DEVICE,         \
           guidAdapter, sizeof(GUID), DPNA_DATATYPE_GUID))) {
    pDPAddress->Release();
    return FALSE;
  }

  // Setup the application description structure
  ZeroMemory(&dpad, sizeof(DPN_APPLICATION_DESC));
  dpad.dwSize          = sizeof(DPN_APPLICATION_DESC);
  dpad.dwFlags         = DPNSESSION_CLIENT_SERVER;
  dpad.guidApplication = g_ApplicationGUID;
  dpad.pwszSessionName = L"ServerSession";
  dpad.dwMaxPlayers    = 256;

  // Start hosting
  if(FAILED(g_pDPServer->Host(&dpad, &pDPAddress, 1, NULL,    \
                              NULL, NULL, 0))) {
    pDPAddress->Release();
    return FALSE;
  }

  // Release the address component
  pDPAddress->Release();

  // Setup the dialog information
  EnableWindow(GetDlgItem(g_hWnd, IDC_ADAPTERS), FALSE);
  SetWindowText(GetDlgItem(g_hWnd, IDC_STARTSTOP), "Stop");

  g_Hosting = TRUE;

  return TRUE;
}

void StopSession()
{
  // Close the connection
  if(g_pDPServer != NULL)
    g_pDPServer->Close(0);

  // Setup the dialog information
  EnableWindow(GetDlgItem(g_hWnd, IDC_ADAPTERS), TRUE);
  SetWindowText(GetDlgItem(g_hWnd, IDC_STARTSTOP), "Start");

  g_Hosting = FALSE;
}

HRESULT WINAPI NetMsgHandler(PVOID pvUserContext,             \
                             DWORD dwMessageId,               \
                             PVOID pMsgBuffer)
{
  DPNMSG_CREATE_PLAYER  *CreatePlayer;
  DPNMSG_DESTROY_PLAYER *DestroyPlayer;
  DPNMSG_RECEIVE        *ReceiveData;
  DPN_PLAYER_INFO       *PlayerInfo;
  DPN_BUFFER_DESC        dpbd;
  DPNHANDLE              hAsync;
  sPlayerInfo           *pPlayer;
  int                    i, nIndex;
  DWORD                  dwSize;
  char                   szMessage[512];
  HRESULT                hr;

  switch(dwMessageId) {
    case DPN_MSGID_CREATE_PLAYER:
      CreatePlayer = (DPNMSG_CREATE_PLAYER*)pMsgBuffer;

      // Get player name and save it
      dwSize = 0;
      PlayerInfo = NULL;
      hr = g_pDPServer->GetClientInfo(                        \
                      CreatePlayer->dpnidPlayer, PlayerInfo,  \
                      &dwSize, 0);
      if(FAILED(hr) && hr != DPNERR_BUFFERTOOSMALL) {
        // Skip this if it's a host player
        if(hr == DPNERR_INVALIDPLAYER)
          break;
        return E_FAIL;
      }
      if((PlayerInfo = (DPN_PLAYER_INFO*)new                  \
                                      BYTE[dwSize]) == NULL)
        return E_FAIL;
      ZeroMemory(PlayerInfo, dwSize);
      PlayerInfo->dwSize = sizeof(DPN_PLAYER_INFO);
      if(FAILED(g_pDPServer->GetClientInfo(                   \
                       CreatePlayer->dpnidPlayer,             \
                       PlayerInfo, &dwSize, 0))) {
        delete[] PlayerInfo;
        return E_FAIL;
      }

      // Find an empty player structure to use
      nIndex = -1;
      for(i=0;i<256;i++) {
        if(!Players[i].dpnidPlayerId) {
          nIndex = i;
          break;
        }
      }
      if(nIndex == -1)
        return E_FAIL;

      // Set player context
      CreatePlayer->pvPlayerContext=(void*)&Players[nIndex];

      // Save player ID
      Players[nIndex].dpnidPlayerId=CreatePlayer->dpnidPlayer;

      // Add player to list
      wcstombs(Players[nIndex].szName,PlayerInfo->pwszName,256);
      SendMessage(GetDlgItem(g_hWnd,IDC_USERS),LB_ADDSTRING,  \
                          0, (LPARAM)Players[nIndex].szName);

      // Send a message to all players notifying someone joined
      sprintf(szMessage, "%s joined!", Players[nIndex].szName);
      SendTextMsg(DPNID_ALL_PLAYERS_GROUP, szMessage);

      delete[] PlayerInfo;

      break;

    case DPN_MSGID_DESTROY_PLAYER:
      DestroyPlayer = (DPNMSG_DESTROY_PLAYER*)pMsgBuffer;

      // Make sure it's not the host
      if((pPlayer =                                           \
          (sPlayerInfo*)DestroyPlayer->pvPlayerContext)==NULL)
        break;

      // Remove the player from list
      pPlayer->dpnidPlayerId = 0;
      nIndex = SendMessage(GetDlgItem(g_hWnd, IDC_USERS),     \
                           LB_FINDSTRING, -1,                 \
                           (LPARAM)pPlayer->szName);
      if(nIndex != LB_ERR)
        SendMessage(GetDlgItem(g_hWnd, IDC_USERS),            \
                               LB_DELETESTRING, nIndex, 0);

      // Send message to remaining players notifying player left
      sprintf(szMessage, "%s quit.", pPlayer->szName);
      SendTextMsg(DPNID_ALL_PLAYERS_GROUP, szMessage);

      break;

    case DPN_MSGID_RECEIVE:
      ReceiveData = (DPNMSG_RECEIVE*)pMsgBuffer;

      // Forward message to all player except host
      dpbd.dwBufferSize = ReceiveData->dwReceiveDataSize;
      dpbd.pBufferData  = (BYTE*)ReceiveData->pReceiveData;
      g_pDPServer->SendTo(DPNID_ALL_PLAYERS_GROUP, &dpbd, 1,  \
                        0, NULL, &hAsync, DPNSEND_NOLOOPBACK);
      break;
  }

  return S_OK;
}

void EnumAdapters()
{
  HWND hCB;
  DPN_SERVICE_PROVIDER_INFO *pAdapterPtr;
  DWORD dwSize = 0;
  DWORD i;
  char szName[1024];
  HRESULT hr;

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

  // Clear the list box
  SendMessage(hCB, CB_RESETCONTENT, 0, 0);

  // Free prior adapter list
  delete[] g_pAdapterList;
  g_pAdapterList = NULL;
  g_dwNumAdapters = 0;

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

  // Query the required size of the data buffer
  hr = g_pDPServer->EnumServiceProviders(&CLSID_DP8SP_TCPIP,  \
          NULL, g_pAdapterList, &dwSize, &g_dwNumAdapters, 0);
  if(hr != DPNERR_BUFFERTOOSMALL)
    return;

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

  // Enumerate again
  if(SUCCEEDED(g_pDPServer->EnumServiceProviders(             \
               &CLSID_DP8SP_TCPIP, NULL, g_pAdapterList,      \
               &dwSize, &g_dwNumAdapters, 0))) {

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

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

      // Add the service provider into box
      SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)szName);

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

  // Select first adapter
  SendMessage(hCB, CB_SETCURSEL, 0, 0);
}

void SendTextMsg(DPNID dpnidPlayer, char *Text)
{
  DPNHANDLE       hAsync;
  DPN_BUFFER_DESC dpbd;

  if(g_pDPServer == NULL)
    return;

  // Build a data structure
  dpbd.dwBufferSize = strlen(Text)+1;
  dpbd.pBufferData = (BYTE*)Text;

  // Send message (async method - reason for handle)
  g_pDPServer->SendTo(dpnidPlayer,&dpbd,1,0,NULL,&hAsync,     \
                      DPNSEND_NOLOOPBACK);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人a区在线观看| 欧美日韩一区二区三区在线 | 欧美国产日韩亚洲一区| 国产精品卡一卡二卡三| 亚洲欧美日韩国产综合在线| 五月天婷婷综合| 国产揄拍国内精品对白| 色妹子一区二区| 精品久久久久久最新网址| 国产精品精品国产色婷婷| 午夜电影一区二区| 国产不卡免费视频| 欧美福利一区二区| 中文一区一区三区高中清不卡| 夜夜嗨av一区二区三区中文字幕| 午夜精品久久久久久| 国产精品99久久久久久久vr| 欧美精品粉嫩高潮一区二区| 中文成人综合网| 免费在线观看精品| 99久久99久久精品免费观看 | 色婷婷亚洲综合| 久久久亚洲午夜电影| 亚洲图片欧美视频| 高清成人在线观看| 日韩免费高清视频| 日韩成人精品视频| 91美女视频网站| 国产亚洲美州欧州综合国| 青草国产精品久久久久久| 色噜噜狠狠成人中文综合| 国产日韩欧美制服另类| 久久成人免费电影| 7777精品伊人久久久大香线蕉最新版| 中文字幕欧美国产| 国产精品一区二区无线| 日韩免费视频线观看| 亚洲高清免费视频| 欧美自拍偷拍午夜视频| 一区二区三区日韩| 色综合色综合色综合 | 天天av天天翘天天综合网| 色屁屁一区二区| 国产精品久久久久久久裸模| 国产99久久久国产精品免费看| 日韩欧美黄色影院| 免费在线观看一区| 日韩欧美一区二区三区在线| 奇米在线7777在线精品| 欧美一区二区在线免费播放| 偷拍日韩校园综合在线| 欧美吻胸吃奶大尺度电影| 亚洲午夜在线观看视频在线| 欧美日韩一区二区三区四区五区| 亚洲精品国产第一综合99久久| 99热这里都是精品| 亚洲激情综合网| 在线影视一区二区三区| 一区二区高清视频在线观看| 欧美日韩精品电影| 日韩经典一区二区| 91精品免费在线| 国产一区二区三区四区在线观看| 久久婷婷国产综合精品青草| 国产高清无密码一区二区三区| 日本一区二区三区国色天香| 白白色 亚洲乱淫| 亚洲一区二区三区视频在线| 欧美精品久久久久久久久老牛影院| 日本一区中文字幕| 久久综合给合久久狠狠狠97色69| 国产乱人伦偷精品视频免下载| 国产精品久久久久影院老司| 欧美色男人天堂| 精品一区二区三区影院在线午夜| 久久精品人人做人人爽人人| 99国产精品久久久久久久久久| 亚洲一区免费视频| 日韩精品最新网址| 99久久精品免费看国产| 亚洲成年人影院| 国产无人区一区二区三区| 色婷婷久久一区二区三区麻豆| 日韩在线a电影| 国产欧美日韩不卡免费| 欧美日韩黄色影视| 国产传媒日韩欧美成人| 亚洲在线免费播放| 国产亚洲福利社区一区| 欧美无砖砖区免费| 国产精品资源站在线| 亚洲最新视频在线观看| 精品对白一区国产伦| 91免费在线视频观看| 美腿丝袜亚洲三区| 日韩毛片在线免费观看| 91精品国产一区二区| 成人黄色小视频| 免费欧美在线视频| 综合亚洲深深色噜噜狠狠网站| 欧美一区二区三区人| 91香蕉国产在线观看软件| 麻豆成人av在线| 亚洲va欧美va天堂v国产综合| 国产精品日韩精品欧美在线| 欧美一级欧美三级在线观看| 日本精品视频一区二区三区| 国产麻豆欧美日韩一区| 日韩在线播放一区二区| 欧美国产精品久久| 精品毛片乱码1区2区3区| 91在线看国产| 国产69精品久久久久毛片| 男人操女人的视频在线观看欧美 | 免费视频最近日韩| 一区二区三区精品在线观看| 国产精品久久久久久久久久久免费看| 欧美不卡视频一区| 日韩一区二区三区四区| 日韩精品一区二区三区中文精品| 一本久久综合亚洲鲁鲁五月天 | 一区二区三区在线不卡| 国产精品白丝在线| 国产日韩v精品一区二区| 精品国产免费人成电影在线观看四季| 欧美私模裸体表演在线观看| 91亚洲精华国产精华精华液| 成人av资源站| 不卡视频一二三四| av在线免费不卡| av网站免费线看精品| av亚洲产国偷v产偷v自拍| 成人avav影音| 91丨九色丨黑人外教| 99国产精品久久久久久久久久| 国产黄色成人av| 国产精品性做久久久久久| 国产精品 日产精品 欧美精品| 国产一区二区三区观看| 国产精品一区二区在线观看网站| 国产一区二区在线看| 国产主播一区二区| 精品一区二区免费看| 国产一区二三区| 丁香五精品蜜臀久久久久99网站 | 亚洲色图一区二区| 亚洲色图视频网| 亚洲午夜在线视频| 蜜桃av一区二区在线观看| 激情都市一区二区| 成人avav在线| 欧美性一区二区| 日韩视频免费观看高清完整版| 日韩亚洲欧美高清| 国产免费成人在线视频| 成人欧美一区二区三区黑人麻豆| 亚洲人成在线观看一区二区| 亚洲国产成人91porn| 免费在线观看一区| 成人av动漫在线| 欧美精品一二三四| 亚洲精品一区二区三区香蕉| 国产精品素人一区二区| 一区二区三区欧美久久| 久久国产三级精品| 国产很黄免费观看久久| 欧美影院午夜播放| 欧美电视剧免费观看| 中文字幕在线视频一区| 国产精品一卡二| 欧美午夜片在线观看| 欧美精品一区在线观看| 亚洲激情综合网| 国内久久精品视频| 91一区二区三区在线观看| 91精品国产综合久久婷婷香蕉| 国产欧美日韩视频一区二区| 亚洲狠狠爱一区二区三区| 国产精品一二三四五| 欧美日韩精品久久久| 国产精品毛片高清在线完整版| 婷婷综合久久一区二区三区| 成人免费视频app| 欧美一级日韩免费不卡| 亚洲欧美偷拍另类a∨色屁股| 久久国产尿小便嘘嘘| 欧美日韩中文字幕一区二区| 国产午夜精品福利| 美女视频黄免费的久久| 欧美亚洲国产怡红院影院| 久久久99精品久久| 日韩国产欧美在线播放| 99re这里只有精品首页| 亚洲精品一区在线观看| 天天操天天干天天综合网| 色综合天天在线| 国产精品毛片久久久久久久 | 中文字幕色av一区二区三区| 蜜桃视频一区二区三区| 91精品国产乱码|