GameSvr.cpp
上传用户:tt_chan
上传日期:2009-12-03
资源大小:4523k
文件大小:8k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // GameSvr.cpp : Defines the entry point for the application.
  2. //
  3. #include "stdafx.h"
  4. #define _BMP_CX 16
  5. #define _BMP_CY 16
  6. // **************************************************************************************
  7. BOOL InitApplication(HANDLE hInstance);
  8. BOOL InitInstance(HANDLE hInstance, int nCmdShow);
  9. LPARAM APIENTRY MainWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
  10. BOOL jRegGetKey(LPCTSTR pSubKeyName, LPCTSTR pValueName, LPBYTE pValue);
  11. BOOL CALLBACK ConfigDlgFunc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
  12. static WSADATA g_wsd;
  13. WNDPROC OrgLogMsgWndProc;
  14. // **************************************************************************************
  15. void __cbDBMsg( char *pState, int nNativeCode, char *pDesc )
  16. {
  17. static TCHAR szState[256], szDesc[2048];
  18. static TCHAR szMsg[2048];
  19. MultiByteToWideChar( CP_ACP, 0, pState, -1, szState, sizeof( szState ) / sizeof( TCHAR ) );
  20. MultiByteToWideChar( CP_ACP, 0, pDesc, -1, szDesc, sizeof( szDesc ) / sizeof( TCHAR ) );
  21. wsprintf( szMsg, _T("ODBC MsgID: %s(%d)"), szState, nNativeCode );
  22. InsertLogMsg( szMsg );
  23. wsprintf( szMsg, _T("%s"), szDesc );
  24. InsertLogMsg( szMsg );
  25. }
  26. LPARAM APIENTRY LogMsgWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
  27. {
  28. if (nMsg == WM_ERASEBKGND)
  29. {
  30. RECT rc;
  31. GetClientRect(hWnd, &rc);
  32. FillRect((HDC)wParam, &rc, CreateSolidBrush(RGB(255, 0, 0)));
  33. }
  34. return CallWindowProc(OrgLogMsgWndProc, hWnd, nMsg, wParam, lParam);
  35. }
  36. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  37. {
  38.     MSG msg;
  39. // if (CheckAvailableIOCP())
  40. // {
  41. if (!InitApplication(hInstance))
  42. return (FALSE);
  43. if (!InitInstance(hInstance, nCmdShow))
  44. return (FALSE);
  45. while (GetMessage(&msg, NULL, 0, 0))
  46. {
  47. TranslateMessage(&msg);
  48. DispatchMessage(&msg);
  49. }
  50. /* }
  51. else
  52. {
  53. TCHAR szMsg[1024];
  54. LoadString(hInstance, IDS_NOTWINNT, szMsg, sizeof(szMsg));
  55. MessageBox(NULL, szMsg, _LOGINGATE_SERVER_TITLE, MB_OK|MB_ICONINFORMATION);
  56. return -1;
  57. }
  58. */
  59.     return (msg.wParam);
  60. }
  61. // **************************************************************************************
  62. //
  63. //
  64. //
  65. // **************************************************************************************
  66. BOOL InitApplication(HANDLE hInstance)
  67. {
  68.     WNDCLASS  wc;
  69.     wc.style            = CS_GLOBALCLASS|CS_HREDRAW|CS_VREDRAW;
  70.     wc.lpfnWndProc      = (WNDPROC)MainWndProc;
  71.     wc.cbClsExtra       = 0;
  72.     wc.cbWndExtra       = 0;
  73.     wc.hIcon            = LoadIcon((HINSTANCE)hInstance, MAKEINTRESOURCE(IDI_MIR2));
  74.     wc.hInstance        = (HINSTANCE)hInstance;
  75.     wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
  76.     wc.hbrBackground    = (HBRUSH)(COLOR_WINDOW + 1);
  77.     wc.lpszMenuName     = MAKEINTRESOURCE(IDR_MAINMENU);
  78.     wc.lpszClassName    = _GAME_SERVER_CLASS;
  79. return RegisterClass(&wc);
  80. }
  81. // **************************************************************************************
  82. //
  83. //
  84. //
  85. // **************************************************************************************
  86. BOOL InitInstance(HANDLE hInstance, int nCmdShow)
  87. {
  88. g_hInst = (HINSTANCE)hInstance;
  89. OleInitialize(NULL);
  90. INITCOMMONCONTROLSEX icex;
  91. icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
  92. icex.dwICC = ICC_LISTVIEW_CLASSES | ICC_BAR_CLASSES | ICC_INTERNET_CLASSES;
  93. InitCommonControlsEx(&icex);
  94.     g_hMainWnd = CreateWindowEx(0, _GAME_SERVER_CLASS, _GAME_SERVER_TITLE, 
  95. WS_OVERLAPPEDWINDOW|WS_VISIBLE,
  96. CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,                 
  97. NULL, NULL, (HINSTANCE)hInstance, NULL);
  98. g_hToolBar = CreateToolbarEx(g_hMainWnd, WS_CHILD|CCS_TOP|WS_VISIBLE|WS_BORDER,
  99. _IDW_TOOLBAR, sizeof(tbButtons) / sizeof(TBBUTTON), (HINSTANCE)hInstance, IDB_TOOLBAR,
  100. (LPCTBBUTTON)&tbButtons, sizeof(tbButtons) / sizeof(TBBUTTON),
  101. _BMP_CX, _BMP_CY, _BMP_CX, _BMP_CY, sizeof(TBBUTTON));
  102. RECT rcMainWnd, rcToolBar, rcStatusBar;
  103. GetClientRect(g_hMainWnd, &rcMainWnd);
  104. GetWindowRect(g_hToolBar, &rcToolBar);
  105. g_hStatusBar = CreateWindowEx(0L, STATUSCLASSNAME, _TEXT(""), WS_CHILD|WS_BORDER|WS_VISIBLE|SBS_SIZEGRIP,
  106. 0, rcMainWnd.bottom - _STATUS_HEIGHT, (rcMainWnd.right - rcMainWnd.left), _STATUS_HEIGHT, g_hMainWnd, (HMENU)_IDW_STATUSBAR, g_hInst, NULL);
  107. int nStatusPartsWidths[_NUMOFMAX_STATUS_PARTS];
  108. int nCnt = 0;
  109. for (int i = _NUMOFMAX_STATUS_PARTS - 1; i >= 0; i--)
  110. nStatusPartsWidths[nCnt++] = (rcMainWnd.right - rcMainWnd.left) - (90 * i);
  111. SendMessage(g_hStatusBar, SB_SETPARTS, _NUMOFMAX_STATUS_PARTS, (LPARAM)nStatusPartsWidths);
  112. GetWindowRect(g_hStatusBar, &rcStatusBar);
  113.     g_hLogMsgWnd = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, _TEXT(""), 
  114. WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_EDITLABELS,
  115. 0, (rcToolBar.bottom - rcToolBar.top), (rcMainWnd.right - rcMainWnd.left), 
  116. (rcMainWnd.bottom - rcMainWnd.top) - (rcToolBar.bottom - rcToolBar.top) - (rcStatusBar.bottom - rcStatusBar.top),
  117. g_hMainWnd, NULL, (HINSTANCE)hInstance, NULL);
  118. ListView_SetExtendedListViewStyleEx(g_hLogMsgWnd, 0, LVS_EX_FULLROWSELECT);
  119. LV_COLUMN lvc;
  120. TCHAR szText[64];
  121. lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  122. lvc.fmt = LVCFMT_LEFT;
  123. lvc.cx = 150;
  124. lvc.pszText = szText;
  125. for (i = 0; i < 3; i++)
  126. {
  127. lvc.iSubItem = i;
  128. LoadString((HINSTANCE)hInstance, IDS_LVS_LABEL1 + i, szText, sizeof(szText)/sizeof(TCHAR));
  129. ListView_InsertColumn(g_hLogMsgWnd, i, &lvc);
  130. }
  131. OrgLogMsgWndProc = (WNDPROC)SetWindowLong(g_hLogMsgWnd, GWL_WNDPROC, (LONG)LogMsgWndProc);
  132. SendMessage(g_hToolBar, TB_SETSTATE, (WPARAM)IDM_STOPSERVICE, (LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
  133. ShowWindow(g_hMainWnd, SW_SHOW);
  134. UpdateWindow(g_hMainWnd);
  135. if (WSAStartup(MAKEWORD(2, 2), &g_wsd) != 0)
  136. return (FALSE);
  137. srand((unsigned)time(NULL));
  138. BYTE btInstalled;
  139. if (!jRegGetKey(_GAME_SERVER_REGISTRY, _TEXT("Installed"), (LPBYTE)&btInstalled))
  140. DialogBox(g_hInst, MAKEINTRESOURCE(IDD_CONFIGDLG), NULL, (DLGPROC)ConfigDlgFunc);
  141. TCHAR wszDatabase[256];
  142. char szDatabase[256];
  143. jRegGetKey(_GAME_SERVER_REGISTRY, _TEXT("Device"), (LPBYTE)wszDatabase);
  144. WideCharToMultiByte(CP_ACP, 0, wszDatabase, -1, szDatabase, sizeof(szDatabase), NULL, NULL);
  145. g_MirDB.SetDiagRec( __cbDBMsg );
  146. g_MirDB.Init();
  147. g_pConnCommon = g_MirDB.CreateConnection( "Mir2_Common", "sa", "prg" );
  148. g_pConnGame = g_MirDB.CreateConnection( szDatabase, "sa", "prg" );
  149. return TRUE;
  150. }
  151. // **************************************************************************************
  152. //
  153. //
  154. //
  155. // **************************************************************************************
  156. int AddNewLogMsg()
  157. {
  158. LV_ITEM lvi;
  159. TCHAR szText[64];
  160. int nCount = ListView_GetItemCount(g_hLogMsgWnd);
  161. if (nCount >= 500)
  162. {
  163. ListView_DeleteItem(g_hLogMsgWnd, 0);
  164. nCount--;
  165. }
  166. lvi.mask = LVIF_TEXT;
  167. lvi.iItem = nCount;
  168. lvi.iSubItem = 0;
  169. _tstrdate(szText);
  170. lvi.pszText = szText;
  171. ListView_InsertItem(g_hLogMsgWnd, &lvi);
  172. _tstrtime(szText);
  173. ListView_SetItemText(g_hLogMsgWnd, nCount, 1, szText);
  174. return nCount;
  175. }
  176. void InsertLogMsg(UINT nID)
  177. {
  178. TCHAR szText[256];
  179. int nCount = AddNewLogMsg();
  180. LoadString(g_hInst, nID, szText, sizeof(szText)/sizeof(TCHAR));
  181. ListView_SetItemText(g_hLogMsgWnd, nCount, 2, szText);
  182. ListView_Scroll(g_hLogMsgWnd, 0, 8);
  183. }
  184. void InsertLogMsg(LPTSTR lpszMsg)
  185. {
  186. int nCount = AddNewLogMsg();
  187. ListView_SetItemText(g_hLogMsgWnd, nCount, 2, lpszMsg);
  188. ListView_Scroll(g_hLogMsgWnd, 0, 8);
  189. }
  190. void InsertLogMsgParam(UINT nID, void *pParam, BYTE btFlags)
  191. {
  192. TCHAR szText[128];
  193. TCHAR szMsg[256];
  194. int nCount = AddNewLogMsg();
  195. LoadString(g_hInst, nID, szText, sizeof(szText)/sizeof(TCHAR));
  196. switch (btFlags)
  197. {
  198. case LOGPARAM_STR:
  199. _stprintf(szMsg, szText, (LPTSTR)pParam);
  200. break;
  201. case LOGPARAM_INT:
  202. _stprintf(szMsg, szText, *(int *)pParam);
  203. break;
  204. }
  205. if (lstrlen(szMsg) <= 256)
  206. {
  207. ListView_SetItemText(g_hLogMsgWnd, nCount, 2, szMsg);
  208. ListView_Scroll(g_hLogMsgWnd, 0, 8);
  209. }
  210. }