诸暨麻将添加redis
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

1579 рядки
42 KiB

  1. // GameServerDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "GameServer.h"
  5. #include "GameServerDlg.h"
  6. #include "afxdialogex.h"
  7. #include "..\..\..\Games\Normal\松滋晃晃血流\消息定义\CMD_Sparrow.h"
  8. #include "BaiDuMap.h"
  9. #include "StatisticalUser.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #endif
  13. //消息定义
  14. #define WM_PROCESS_CMD_LINE (WM_USER+100) //处理命令
  15. #define WM_MY_CMD_LINE (WM_USER+101) //更新数据
  16. #define WM_MYMSG (WM_USER+110) //禁止加入房间与禁止分配
  17. #define WM_MYMSGACK (WM_USER+111) //禁止加入房间与禁止分配的结果回复
  18. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  19. class CAboutDlg : public CDialogEx
  20. {
  21. public:
  22. CAboutDlg();
  23. // 对话框数据
  24. enum { IDD = IDD_ABOUTBOX };
  25. protected:
  26. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  27. // 实现
  28. protected:
  29. DECLARE_MESSAGE_MAP()
  30. };
  31. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  32. {
  33. }
  34. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  35. {
  36. CDialogEx::DoDataExchange(pDX);
  37. }
  38. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  39. END_MESSAGE_MAP()
  40. // CGameServerDlg 对话框
  41. STARTP CGameServerDlg::g_StartP;
  42. bool CGameServerDlg::g_bGameLog = true;
  43. CGameServerDlg::CGameServerDlg(CWnd* pParent /*=NULL*/)
  44. : CDialogEx(CGameServerDlg::IDD, pParent)
  45. {
  46. ZeroMemory(&m_Data, sizeof(m_Data));
  47. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  48. iRenWuID = 0;
  49. }
  50. void CGameServerDlg::DoDataExchange(CDataExchange* pDX)
  51. {
  52. CDialogEx::DoDataExchange(pDX);
  53. DDX_Control(pDX, IDC_TRACE_MESSAGE, m_TraceServiceControl);
  54. DDX_Control(pDX, IDC_COMBO1, mListBox);
  55. DDX_Control(pDX, IDC_GAME_NAME2, a1);
  56. DDX_Control(pDX, IDC_SERVER_PORT2, a2);
  57. DDX_Control(pDX, IDC_GAME_NAME3, b1);
  58. DDX_Control(pDX, IDC_SERVER_PORT3, b2);
  59. DDX_Control(pDX, IDC_GAME_NAME4, c1);
  60. DDX_Control(pDX, IDC_SERVER_PORT4, c2);
  61. DDX_Control(pDX, IDC_GAME_NAME5, d1);
  62. DDX_Control(pDX, IDC_SERVER_PORT5, d2);
  63. DDX_Control(pDX, IDC_GAME_NAME6, e1);
  64. DDX_Control(pDX, IDC_SERVER_PORT6, e2);
  65. DDX_Control(pDX, IDC_GAME_NAME7, f1);
  66. DDX_Control(pDX, IDC_SERVER_PORT7, f2);
  67. DDX_Control(pDX, IDC_GAME_NAME8, g1);
  68. DDX_Control(pDX, IDC_SERVER_PORT8, g2);
  69. DDX_Control(pDX, IDC_GAME_NAME9, h1);
  70. DDX_Control(pDX, IDC_SERVER_PORT9, h2);
  71. DDX_Control(pDX, IDC_GAME_NAME10, i1);
  72. DDX_Control(pDX, IDC_SERVER_PORT10, i2);
  73. DDX_Control(pDX, IDC_GAME_NAME11, j1);
  74. DDX_Control(pDX, IDC_GAME_NAME12, game1);
  75. DDX_Control(pDX, IDC_GAME_NAME13, game2);
  76. DDX_Control(pDX, IDC_GAME_NAME14, game3);
  77. DDX_Control(pDX, IDC_GAME_NAME15, game4);
  78. DDX_Control(pDX, IDC_GAME_NAME16, game5);
  79. DDX_Control(pDX, IDC_GAME_NAME17, game6);
  80. DDX_Control(pDX, IDC_GAME_NAME18, game7);
  81. DDX_Control(pDX, IDC_GAME_NAME19, game8);
  82. DDX_Control(pDX, IDC_COMBO2, j2);
  83. DDX_Control(pDX, IDC_COMBO3, j3);
  84. DDX_Control(pDX, IDC_EDIT1, j4);
  85. DDX_Control(pDX, IDC_EDIT2, j5);
  86. DDX_Control(pDX, IDC_EDIT3, j6);
  87. DDX_Control(pDX, IDC_EDIT4, j7);
  88. DDX_Control(pDX, IDC_LIST1, bbb);
  89. DDX_Control(pDX, IDC_LIST2, ccc); ///---桌子列表
  90. }
  91. BEGIN_MESSAGE_MAP(CGameServerDlg, CDialogEx)
  92. ON_WM_SYSCOMMAND()
  93. ON_WM_PAINT()
  94. ON_WM_QUERYDRAGICON()
  95. ON_WM_QUERYENDSESSION()
  96. ON_BN_CLICKED(IDC_START_SERVICE, &CGameServerDlg::OnBnClickedStartService)
  97. ON_BN_CLICKED(IDC_STOP_SERVICE, &CGameServerDlg::OnBnClickedStopService)
  98. ON_BN_CLICKED(IDC_OPEN_SERVER, &CGameServerDlg::OnBnClickedOpenServer)
  99. ON_BN_CLICKED(IDC_OPEN_MATCH, &CGameServerDlg::OnBnClickedOpenMatch)
  100. ON_BN_CLICKED(IDC_CREATE_SERVER, &CGameServerDlg::OnBnClickedCreateServer)
  101. ON_BN_CLICKED(IDC_OPTION_SERVER, &CGameServerDlg::OnBnClickedOptionServer)
  102. ON_BN_CLICKED(IDC_OPTION_MATCH, &CGameServerDlg::OnBnClickedOptionMatch)
  103. ON_MESSAGE(WM_PROCESS_CMD_LINE, &CGameServerDlg::OnMessageProcessCmdLine)
  104. ON_MESSAGE(WM_MY_CMD_LINE, &CGameServerDlg::OnMessageUpdata)
  105. ON_MESSAGE(WM_MYMSG, &CGameServerDlg::OnMessageStop)
  106. ON_WM_TIMER()
  107. ON_BN_CLICKED(IDC_BUTTON1, &CGameServerDlg::OnSendGongGaoButton1)
  108. ON_BN_CLICKED(IDC_BUTTON2, &CGameServerDlg::OnBnClickedButton2)
  109. ON_NOTIFY(BCN_HOTITEMCHANGE, IDC_CHECK2, &CGameServerDlg::OnBnHotItemChangeCheck2)
  110. ON_BN_CLICKED(IDC_CHECK2, &CGameServerDlg::OnBnClickedCheck2)
  111. ON_BN_CLICKED(IDC_CHECK3, &CGameServerDlg::OnBnClickedCheck3)
  112. ON_BN_CLICKED(IDC_BUTTON7, &CGameServerDlg::OnBnClickedButton7)
  113. ON_BN_CLICKED(IDC_BUTTON4, &CGameServerDlg::OnBnClickedButton4)
  114. ON_BN_CLICKED(IDC_CHECK4, &CGameServerDlg::OnBnClickedCheck4)
  115. ON_BN_CLICKED(IDC_BUTTON5, &CGameServerDlg::OnBnClickedButton5)
  116. ON_BN_CLICKED(IDC_BUTTON6, &CGameServerDlg::OnBnClickedButton6)
  117. ON_BN_CLICKED(IDC_BUTTON3, &CGameServerDlg::OnBnClickedButton3)
  118. ON_BN_CLICKED(IDC_BUTTON8, &CGameServerDlg::OnBnClickedButton8)
  119. ON_BN_CLICKED(IDC_CHECK5, &CGameServerDlg::OnBnClickedCheck5)
  120. ON_LBN_SELCHANGE(IDC_LIST2, &CGameServerDlg::OnLbnSelchangeList2)
  121. ON_BN_CLICKED(IDC_CHECK6, &CGameServerDlg::OnBnClickedCheck6)
  122. ON_BN_CLICKED(IDC_CHECK7, &CGameServerDlg::OnBnClickedCheck7)
  123. ON_BN_CLICKED(IDC_BUTTON9, &CGameServerDlg::OnBnClickedButton9)
  124. END_MESSAGE_MAP()
  125. // CGameServerDlg 消息处理程序
  126. BOOL CGameServerDlg::OnInitDialog()
  127. {
  128. CDialogEx::OnInitDialog();
  129. //设置标题
  130. SetWindowText(TEXT("游戏服务器 -- [ 停止 ]"));
  131. // IDM_ABOUTBOX 必须在系统命令范围内。
  132. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  133. ASSERT(IDM_ABOUTBOX < 0xF000);
  134. CMenu* pSysMenu = GetSystemMenu(FALSE);
  135. if (pSysMenu != NULL)
  136. {
  137. BOOL bNameValid;
  138. CString strAboutMenu;
  139. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  140. ASSERT(bNameValid);
  141. if (!strAboutMenu.IsEmpty())
  142. {
  143. pSysMenu->AppendMenu(MF_SEPARATOR);
  144. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  145. }
  146. }
  147. // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
  148. // 执行此操作
  149. SetIcon(m_hIcon, TRUE); // 设置大图标
  150. SetIcon(m_hIcon, FALSE); // 设置小图标
  151. //设置组件
  152. m_ServiceUnits.SetServiceUnitsSink(this);
  153. mListBox.InsertString(0, _T("一级(红名服务器)"));
  154. mListBox.InsertString(1, _T("二级(默认服务器)"));
  155. mListBox.InsertString(2, _T("VIP一级"));
  156. mListBox.InsertString(3, _T("VIP二级"));
  157. mListBox.InsertString(4, _T("VIP三级"));
  158. mListBox.InsertString(5, _T("VIP四级"));
  159. mListBox.InsertString(6, _T("VIP五级"));
  160. mListBox.InsertString(7, _T("VIP六级"));
  161. j2.InsertString(0, _T("五秒循环一次"));
  162. j2.InsertString(1, _T("十秒循环一次"));
  163. j2.InsertString(2, _T("十五秒循环一次"));
  164. j2.InsertString(3, _T("二十秒循环一次"));
  165. j2.InsertString(4, _T("三十秒循环一次"));
  166. j2.InsertString(5, _T("一分钟循环一次"));
  167. j2.InsertString(6, _T("一小时循环一次"));
  168. j2.SetCurSel(0);
  169. j3.InsertString(0, _T("十五秒后"));
  170. j3.InsertString(1, _T("三十秒后"));
  171. j3.InsertString(2, _T("四十五秒后"));
  172. j3.InsertString(3, _T("六十秒后"));
  173. j3.InsertString(4, _T("一百二十秒后"));
  174. j3.InsertString(5, _T("一小时后"));
  175. j3.InsertString(6, _T("一天后"));
  176. j3.SetCurSel(0);
  177. CButton *pCheckbox = (CButton*)GetDlgItem(IDC_CHECK1);
  178. pCheckbox->SetCheck(true);
  179. pCheckbox = (CButton*)GetDlgItem(IDC_RADIO2);
  180. pCheckbox->SetCheck(true);
  181. ((CButton*)GetDlgItem(IDC_CHECK2))->SetCheck(true);
  182. ((CButton*)GetDlgItem(IDC_CHECK3))->SetCheck(true);
  183. ((CButton*)GetDlgItem(IDC_CHECK4))->SetCheck(true);
  184. ((CButton*)GetDlgItem(IDC_CHECK7))->SetCheck(true);
  185. LoadInitParameter();
  186. StatisticalUser::EnablePriv();
  187. //SetTimer(100, 1000, NULL);
  188. //命令处理
  189. LPCTSTR pszCmdLine = AfxGetApp()->m_lpCmdLine;
  190. if (pszCmdLine[0] != 0) PostMessage(WM_PROCESS_CMD_LINE, 0, (LPARAM)pszCmdLine);
  191. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  192. }
  193. BOOL CGameServerDlg::UpData(TagUpData Data)
  194. {
  195. CGameServerDlg *pCGameServerDlg = (CGameServerDlg *)theApp.m_pMainWnd;
  196. pCGameServerDlg->m_Data = Data;
  197. if (pCGameServerDlg) pCGameServerDlg->PostMessage(WM_MY_CMD_LINE, 0, (LPARAM)&(pCGameServerDlg->m_Data));
  198. return TRUE;
  199. }
  200. void CGameServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
  201. {
  202. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  203. {
  204. CAboutDlg dlgAbout;
  205. dlgAbout.DoModal();
  206. }
  207. else
  208. {
  209. CDialogEx::OnSysCommand(nID, lParam);
  210. }
  211. }
  212. // 如果向对话框添加最小化按钮,则需要下面的代码
  213. // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
  214. // 这将由框架自动完成。
  215. void CGameServerDlg::OnPaint()
  216. {
  217. if (IsIconic())
  218. {
  219. CPaintDC dc(this); // 用于绘制的设备上下文
  220. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  221. // 使图标在工作区矩形中居中
  222. int cxIcon = GetSystemMetrics(SM_CXICON);
  223. int cyIcon = GetSystemMetrics(SM_CYICON);
  224. CRect rect;
  225. GetClientRect(&rect);
  226. int x = (rect.Width() - cxIcon + 1) / 2;
  227. int y = (rect.Height() - cyIcon + 1) / 2;
  228. // 绘制图标
  229. dc.DrawIcon(x, y, m_hIcon);
  230. }
  231. else
  232. {
  233. CDialogEx::OnPaint();
  234. }
  235. }
  236. //当用户拖动最小化窗口时系统调用此函数取得光标
  237. //显示。
  238. HCURSOR CGameServerDlg::OnQueryDragIcon()
  239. {
  240. return static_cast<HCURSOR>(m_hIcon);
  241. }
  242. BOOL CGameServerDlg::OnQueryEndSession()
  243. {
  244. if (!CDialogEx::OnQueryEndSession())
  245. return FALSE;
  246. // TODO: 在此添加专用的查询结束会话代码
  247. return TRUE;
  248. }
  249. void CGameServerDlg::OnCancel()
  250. {
  251. //关闭询问
  252. if (m_ServiceUnits.GetServiceStatus() != ServiceStatus_Stop)
  253. {
  254. LPCTSTR pszQuestion = TEXT("游戏服务器正在运行中,您确实要关闭服务器吗?");
  255. if (AfxMessageBox(pszQuestion, MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION) != IDYES) return;
  256. }
  257. //停止服务
  258. StopService();
  259. __super::OnCancel();
  260. }
  261. void CGameServerDlg::OnOK()
  262. {
  263. return;
  264. }
  265. BOOL CGameServerDlg::PreTranslateMessage(MSG* pMsg)
  266. {
  267. //按键过滤
  268. if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_ESCAPE))
  269. {
  270. return TRUE;
  271. }
  272. return __super::PreTranslateMessage(pMsg);
  273. }
  274. //停止业务
  275. LRESULT CGameServerDlg::OnMessageStop(WPARAM wParam, LPARAM lParam)
  276. {
  277. WORD wTest = lParam;
  278. if (wTest != g_StartP.wServerID)
  279. {
  280. return 0;
  281. }
  282. iRenWuID = wParam;//任务ID
  283. //停止业务
  284. ((CButton*)GetDlgItem(IDC_CHECK2))->SetCheck(0);
  285. ((CButton*)GetDlgItem(IDC_CHECK4))->SetCheck(0);
  286. ((CButton*)GetDlgItem(IDC_CHECK7))->SetCheck(0);
  287. int iRet = 0;
  288. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_CJ, 0, &iRet, sizeof(int));
  289. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_WORK, 0, &iRet, sizeof(int));
  290. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_HUA_CREATE, 0, &iRet, sizeof(int));
  291. //启动定时器检测停止结果
  292. SetTimer(100, 10 * 1000, NULL);
  293. //强制关闭时间
  294. SetTimer(101, 30 * 60 * 1000, NULL);
  295. return 0L;
  296. }
  297. LRESULT CGameServerDlg::OnMessageUpdata(WPARAM wParam, LPARAM lParam)
  298. {
  299. CTime Now = CTime::GetCurrentTime();
  300. CString csTime = Now.Format(_T("%Y-%m-%d %H:%M:%S"));
  301. i2.SetWindowText(csTime); ///---上次上报
  302. CString csTest;
  303. csTest.Format(L"%d", m_Data.iTableCount);
  304. a1.SetWindowText(csTest);
  305. csTest.Format(L"%d", m_Data.iPlayingTableCount);
  306. a2.SetWindowText(csTest);
  307. csTest.Format(L"%d", m_Data.iFreeTableCount);
  308. b1.SetWindowText(csTest);
  309. csTest.Format(L"%d", m_Data.iDownTableCount);
  310. b2.SetWindowText(csTest);
  311. csTest.Format(L"%d", m_Data.iLoginBody);
  312. c1.SetWindowText(csTest);
  313. csTest.Format(L"%d", m_Data.iDownBody);
  314. c2.SetWindowText(csTest);
  315. csTest.Format(L"%d", m_Data.iDaTingBody);
  316. d1.SetWindowText(csTest);
  317. csTest.Format(L"%d", m_Data.iLinkBody);
  318. d2.SetWindowText(csTest);
  319. csTest.Format(L"%d", m_Data.iSocketNum);
  320. e1.SetWindowText(csTest);
  321. csTest.Format(L"%d", m_Data.iErrQ);
  322. e2.SetWindowText(csTest);
  323. csTest.Format(L"%d", m_Data.iFreeCon);
  324. f1.SetWindowText(csTest);
  325. csTest.Format(L"%d", m_Data.iQNum);
  326. f2.SetWindowText(csTest);
  327. csTest.Format(L"%d/%d", m_Data.dLoginQ, m_Data.dLoginQOK);
  328. g1.SetWindowText(csTest);
  329. csTest.Format(L"%d/%d", m_Data.dChongZhi, m_Data.dChongZhiOK);
  330. g2.SetWindowText(csTest);
  331. csTest.Format(L"%d", m_Data.dCreateTable);
  332. h1.SetWindowText(csTest);
  333. csTest.Format(L"%d/%d", m_Data.dAddRoom, m_Data.dAddRoomChange);
  334. h2.SetWindowText(csTest);
  335. csTest.Format(L"%d", m_Data.dLoginDuanXianOK);
  336. j1.SetWindowText(csTest);
  337. ccc.ResetContent();
  338. for (int i = 0; i < m_Data.iTableCount; i++)
  339. {
  340. csTest.Format(L"%d", m_Data.PrivteTable[i]);
  341. ccc.InsertString(i, csTest);
  342. }
  343. return 0L;
  344. }
  345. LRESULT CGameServerDlg::OnMessageProcessCmdLine(WPARAM wParam, LPARAM lParam)
  346. {
  347. //变量定义
  348. CWHCommandLine CommandLine;
  349. LPCTSTR pszCommandLine = (LPCTSTR)(lParam);
  350. //房间标识
  351. TCHAR szSrverID[32] = TEXT("");
  352. if (CommandLine.SearchCommandItem(pszCommandLine, TEXT("/ServerID:"), szSrverID, CountArray(szSrverID)) == true)
  353. {
  354. //获取房间
  355. WORD wServerID = (WORD)(_tstol(szSrverID));
  356. //启动房间
  357. if (wServerID != 0)
  358. {
  359. //设置变量
  360. m_bAutoControl = true;
  361. //启动房间
  362. StartServerService(wServerID);
  363. }
  364. }
  365. return 0L;
  366. }
  367. VOID CGameServerDlg::OnServiceUnitsStatus(enServiceStatus ServiceStatus)
  368. {
  369. //状态设置
  370. switch (ServiceStatus)
  371. {
  372. case ServiceStatus_Stop: //停止状态
  373. {
  374. //更新标题
  375. UpdateServerTitle(ServiceStatus);
  376. //服务按钮
  377. GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(FALSE);
  378. GetDlgItem(IDC_START_SERVICE)->EnableWindow(TRUE);
  379. //配置按钮
  380. GetDlgItem(IDC_OPEN_MATCH)->EnableWindow(TRUE);
  381. GetDlgItem(IDC_OPEN_SERVER)->EnableWindow(TRUE);
  382. GetDlgItem(IDC_CREATE_SERVER)->EnableWindow(TRUE);
  383. GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(TRUE);
  384. if ((m_ModuleInitParameter.GameServiceOption.wServerType&GAME_GENRE_MATCH) != 0)
  385. GetDlgItem(IDC_OPTION_MATCH)->EnableWindow(TRUE);
  386. //运行按钮
  387. GetDlgItem(IDC_RUN_PARAMETER)->EnableWindow(FALSE);
  388. GetDlgItem(IDC_SERVICE_CONTROL)->EnableWindow(FALSE);
  389. //提示信息
  390. LPCTSTR pszDescribe = TEXT("服务停止成功");
  391. CTraceService::TraceString(pszDescribe, TraceLevel_Normal);
  392. break;
  393. }
  394. case ServiceStatus_Config: //配置状态
  395. {
  396. //更新标题
  397. UpdateServerTitle(ServiceStatus);
  398. //设置按钮
  399. GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(TRUE);
  400. GetDlgItem(IDC_START_SERVICE)->EnableWindow(FALSE);
  401. //配置按钮
  402. GetDlgItem(IDC_OPEN_MATCH)->EnableWindow(FALSE);
  403. GetDlgItem(IDC_OPEN_SERVER)->EnableWindow(FALSE);
  404. GetDlgItem(IDC_CREATE_SERVER)->EnableWindow(FALSE);
  405. GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(FALSE);
  406. GetDlgItem(IDC_OPTION_MATCH)->EnableWindow(FALSE);
  407. //运行按钮
  408. GetDlgItem(IDC_RUN_PARAMETER)->EnableWindow(FALSE);
  409. GetDlgItem(IDC_SERVICE_CONTROL)->EnableWindow(FALSE);
  410. //提示信息
  411. LPCTSTR pszDescribe = TEXT("正在初始化组件...");
  412. CTraceService::TraceString(pszDescribe, TraceLevel_Normal);
  413. break;
  414. }
  415. case ServiceStatus_Service: //服务状态
  416. {
  417. //更新标题
  418. //UpdateServerTitle(ServiceStatus);
  419. TCHAR buf[100] = {0};
  420. GetCurrentDirectory(sizeof(buf), buf);
  421. HINSTANCE hInst = NULL;
  422. hInst = AfxGetApp()->m_hInstance;
  423. TCHAR path_buffer[_MAX_PATH] = {0};
  424. GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径
  425. CString csTest = L"";
  426. //csTest.Format(TEXT("游戏服务器V1.2 -- [ 运行 ] -- [服务器编号:%d]-- [ 启动路径:%s ]"), m_ServiceUnits.GetGameServiceOption()->wServerID, path_buffer);
  427. csTest.Format(TEXT("[ %s ] -- [ 运行 ] -- [服务器编号:%d]-- [ 启动路径:%s ]"), m_ServiceUnits.GetGameServiceOption()->szServerName, m_ServiceUnits.GetGameServiceOption()->wServerID, path_buffer);
  428. SetWindowText(csTest);
  429. //服务按钮
  430. GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(TRUE);
  431. GetDlgItem(IDC_START_SERVICE)->EnableWindow(FALSE);
  432. //配置按钮
  433. GetDlgItem(IDC_OPEN_MATCH)->EnableWindow(FALSE);
  434. GetDlgItem(IDC_OPEN_SERVER)->EnableWindow(FALSE);
  435. GetDlgItem(IDC_CREATE_SERVER)->EnableWindow(FALSE);
  436. GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(FALSE);
  437. //运行按钮
  438. GetDlgItem(IDC_RUN_PARAMETER)->EnableWindow(TRUE);
  439. GetDlgItem(IDC_SERVICE_CONTROL)->EnableWindow(TRUE);
  440. //提示信息
  441. LPCTSTR pszDescribe = TEXT("服务启动成功");
  442. CTraceService::TraceString(pszDescribe, TraceLevel_Normal);
  443. break;
  444. }
  445. }
  446. return;
  447. }
  448. VOID CGameServerDlg::UpdateServerLogo(LPCTSTR pszServerDLL)
  449. {
  450. //加载资源
  451. HINSTANCE hInstance = AfxLoadLibrary(pszServerDLL);
  452. //加载图形
  453. if (hInstance != NULL)
  454. {
  455. //设置资源
  456. AfxSetResourceHandle(hInstance);
  457. //设置资源
  458. CStatic * pServerLogo = (CStatic *)GetDlgItem(IDC_SERVER_LOGO);
  459. pServerLogo->SetIcon(::LoadIcon(hInstance, TEXT("SERVER_ICON")));
  460. //释放资源
  461. AfxFreeLibrary(hInstance);
  462. AfxSetResourceHandle(GetModuleHandle(NULL));
  463. }
  464. return;
  465. }
  466. VOID CGameServerDlg::UpdateServerTitle(enServiceStatus ServiceStatus)
  467. {
  468. //变量定义
  469. LPCTSTR pszStatusName = NULL;
  470. LPCTSTR pszServerName = NULL;
  471. //状态字符
  472. switch (ServiceStatus)
  473. {
  474. case ServiceStatus_Stop: //停止状态
  475. {
  476. pszStatusName = TEXT("停止");
  477. break;
  478. }
  479. case ServiceStatus_Config: //配置状态
  480. {
  481. pszStatusName = TEXT("初始化");
  482. break;
  483. }
  484. case ServiceStatus_Service: //运行状态
  485. {
  486. pszStatusName = TEXT("运行");
  487. break;
  488. }
  489. }
  490. //房间名字
  491. if (m_bOptionSuccess == false) pszServerName = TEXT("游戏服务器");
  492. else pszServerName = m_ModuleInitParameter.GameServiceOption.szServerName;
  493. //构造标题
  494. TCHAR szTitle[128] = TEXT("");
  495. _sntprintf(szTitle, CountArray(szTitle), TEXT("[ %s ] -- [ %s ]"), pszServerName, pszStatusName);
  496. //设置标题
  497. SetWindowText(szTitle);
  498. return;
  499. }
  500. VOID CGameServerDlg::UpdateParameterStatus(tagModuleInitParameter & ModuleInitParameter)
  501. {
  502. //设置变量
  503. m_bOptionSuccess = true;
  504. m_ModuleInitParameter = ModuleInitParameter;
  505. //更新标题
  506. UpdateServerTitle(ServiceStatus_Stop);
  507. UpdateServerLogo(ModuleInitParameter.GameServiceAttrib.szServerDLLName);
  508. //设置按钮
  509. GetDlgItem(IDC_START_SERVICE)->EnableWindow(TRUE);
  510. GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(TRUE);
  511. //不是比赛就过滤
  512. if ((ModuleInitParameter.GameServiceOption.wServerType&GAME_GENRE_MATCH) != 0)
  513. {
  514. GetDlgItem(IDC_OPTION_MATCH)->EnableWindow(TRUE);
  515. }
  516. else
  517. {
  518. GetDlgItem(IDC_OPTION_MATCH)->EnableWindow(FALSE);
  519. }
  520. //设置控件
  521. SetDlgItemText(IDC_GAME_NAME, m_ModuleInitParameter.GameServiceAttrib.szGameName);
  522. SetDlgItemText(IDC_SERVER_NAME, m_ModuleInitParameter.GameServiceOption.szServerName);
  523. //监听端口
  524. if (m_ModuleInitParameter.GameServiceOption.wServerPort == 0)
  525. {
  526. SetDlgItemText(IDC_SERVER_PORT, TEXT("自动适配"));
  527. }
  528. else
  529. {
  530. SetDlgItemInt(IDC_SERVER_PORT, m_ModuleInitParameter.GameServiceOption.wServerPort);
  531. }
  532. //设置模块
  533. LPCTSTR pszServerDLLName = m_ModuleInitParameter.GameServiceAttrib.szServerDLLName;
  534. m_ServiceUnits.CollocateService(pszServerDLLName, m_ModuleInitParameter.GameServiceOption, m_ModuleInitParameter.vecVenueInfo);
  535. //构造提示
  536. TCHAR szString[256] = TEXT("");
  537. LPCTSTR pszServerName = m_ModuleInitParameter.GameServiceOption.szServerName;
  538. _sntprintf(szString, CountArray(szString), TEXT("[ %s ] 房间参数加载成功"), pszServerName);
  539. //输出信息
  540. CTraceService::TraceString(szString, TraceLevel_Normal);
  541. return;
  542. }
  543. bool CGameServerDlg::StartServerService(WORD wServerID)
  544. {
  545. //变量定义
  546. tagDataBaseParameter DataBaseParameter;
  547. ZeroMemory(&DataBaseParameter, sizeof(DataBaseParameter));
  548. //设置参数
  549. InitDataBaseParameter(DataBaseParameter);
  550. m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter);
  551. //读取配置
  552. CDlgServerItem DlgServerItem;
  553. if (DlgServerItem.OpenGameServer(wServerID) == false)
  554. {
  555. CTraceService::TraceString(TEXT("房间配置参数不存在或者加载失败"), TraceLevel_Exception);
  556. return false;
  557. }
  558. //更新状态
  559. UpdateParameterStatus(DlgServerItem.m_ModuleInitParameter);
  560. //启动服务
  561. try
  562. {
  563. m_ServiceUnits.StartService();
  564. }
  565. catch (...)
  566. {
  567. ASSERT(FALSE);
  568. }
  569. return true;
  570. }
  571. bool CGameServerDlg::InitDataBaseParameter(tagDataBaseParameter & DataBaseParameter)
  572. {
  573. //获取路径
  574. TCHAR szWorkDir[MAX_PATH] = TEXT("");
  575. CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir));
  576. //构造路径
  577. TCHAR szIniFile[MAX_PATH] = TEXT("");
  578. _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\ServerParameter.ini"), szWorkDir);
  579. //读取配置
  580. CWHIniData IniData;
  581. IniData.SetIniFilePath(szIniFile);
  582. //连接信息
  583. DataBaseParameter.wDataBasePort = (WORD)IniData.ReadInt(TEXT("PlatformDB"), TEXT("DBPort"), 1433);
  584. IniData.ReadEncryptString(TEXT("PlatformDB"), TEXT("DBAddr"), NULL, DataBaseParameter.szDataBaseAddr, CountArray(DataBaseParameter.szDataBaseAddr));
  585. IniData.ReadEncryptString(TEXT("PlatformDB"), TEXT("DBUser"), NULL, DataBaseParameter.szDataBaseUser, CountArray(DataBaseParameter.szDataBaseUser));
  586. IniData.ReadEncryptString(TEXT("PlatformDB"), TEXT("DBPass"), NULL, DataBaseParameter.szDataBasePass, CountArray(DataBaseParameter.szDataBasePass));
  587. IniData.ReadEncryptString(TEXT("PlatformDB"), TEXT("DBName"), szPlatformDB, DataBaseParameter.szDataBaseName, CountArray(DataBaseParameter.szDataBaseName));
  588. CString m_HttpPath;
  589. //读取字符
  590. DWORD dwReadCount = GetPrivateProfileString(TEXT("HTTP"), TEXT("PATH"), NULL, CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath, 512, szIniFile);
  591. //读取字符
  592. DWORD dwReadCount2 = GetPrivateProfileString(TEXT("HTTP2"), TEXT("PATH2"), NULL, CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath2, 512, szIniFile);
  593. //读取字符
  594. DWORD dwReadCount3 = GetPrivateProfileString(TEXT("HTTP3"), TEXT("PATH3"), NULL, CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath3, 512, szIniFile);
  595. DWORD dwReadCount4 = GetPrivateProfileString(TEXT("HTTP4"), TEXT("PATH4"), NULL, CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath4, 512, szIniFile);
  596. ///+++客户端最低要求版本号
  597. GetPrivateProfileString(TEXT("ClientVer"), TEXT("version"), L"1.0.0", CServiceUnits::g_pServiceUnits->m_InitParameter.m_szMinClientVer, 32, szIniFile);
  598. return true;
  599. }
  600. void CGameServerDlg::OnBnClickedStartService()
  601. {
  602. //启动服务
  603. try
  604. {
  605. int iRet = 0;
  606. CString csText;
  607. iRet = mListBox.GetCurSel();
  608. iRet++;
  609. csText.Format(L"%d", iRet);
  610. //获取路径
  611. TCHAR szWorkDir[MAX_PATH] = TEXT("");
  612. CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir));
  613. //构造路径
  614. TCHAR szIniFile[MAX_PATH] = TEXT("");
  615. _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\Parameter.ini"), szWorkDir);
  616. //保存
  617. BOOL bRet = WritePrivateProfileString(TEXT("Server"), TEXT("Level"), csText, szIniFile);
  618. m_ServiceUnits.m_InitParameter.m_ServiceLevel = iRet;
  619. m_StartTime = CTime::GetCurrentTime();
  620. SetTimer(1, 30000, NULL);
  621. //启用共享内存
  622. HANDLE m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _T("GAMESERVERINFOG__"));
  623. if (m_hMapFile)
  624. {
  625. //显示共享的文件数据。
  626. LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  627. HINSTANCE hInst = NULL;
  628. hInst = AfxGetApp()->m_hInstance;
  629. TCHAR path_buffer[_MAX_PATH] = { 0 };
  630. GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径
  631. GAMESERVERINFOALL *pBuffer = (GAMESERVERINFOALL *)lpMapAddr;
  632. //检测当前节点是否存在
  633. if (pBuffer->iNum > 20)
  634. {
  635. CTraceService::TraceString(TEXT("共享内存数据数据混乱"), TraceLevel_Warning);
  636. goto look;
  637. }
  638. //查找节点是否已经存在
  639. for (int i = 0; i < pBuffer->iNum; i++)
  640. {
  641. if (pBuffer->Data[i].dServerID == g_StartP.wServerID)
  642. {
  643. StringCchCopy(pBuffer->Data[i].szPath, 256, path_buffer);
  644. pBuffer->Data[i].iStat = 1;
  645. pBuffer->Data[i].Pid = GetCurrentProcessId();
  646. FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1);
  647. goto look;
  648. }
  649. }
  650. (pBuffer->iNum)++;
  651. pBuffer->Data[pBuffer->iNum - 1].dServerID = g_StartP.wServerID;
  652. StringCchCopy(pBuffer->Data[pBuffer->iNum - 1].szPath, 256, path_buffer);
  653. pBuffer->Data[pBuffer->iNum - 1].iStat = 1;
  654. pBuffer->Data[pBuffer->iNum - 1].Pid = GetCurrentProcessId();
  655. FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1);
  656. }
  657. else
  658. {
  659. //创建共享文件。
  660. m_hMapFile = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
  661. PAGE_READWRITE, 0, 0x10000, _T("GAMESERVERINFOG__"));
  662. //拷贝数据到共享文件里。
  663. LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  664. HINSTANCE hInst = NULL;
  665. hInst = AfxGetApp()->m_hInstance;
  666. TCHAR path_buffer[_MAX_PATH] = { 0 };
  667. GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径
  668. GAMESERVERINFOALL Buffer;
  669. ZeroMemory(&Buffer, sizeof(GAMESERVERINFOALL));
  670. Buffer.iNum++;
  671. Buffer.Data[Buffer.iNum - 1].dServerID = g_StartP.wServerID;
  672. StringCchCopy(Buffer.Data[Buffer.iNum - 1].szPath, 256, path_buffer);
  673. Buffer.Data[Buffer.iNum - 1].iStat = 1;
  674. Buffer.Data[Buffer.iNum - 1].Pid = GetCurrentProcessId();
  675. StringCchCopy(Buffer.szCtrl, 256, g_StartP.szCeLv);
  676. memcpy(lpMapAddr, &Buffer, sizeof(GAMESERVERINFOALL));
  677. FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1);
  678. }
  679. look:
  680. m_ServiceUnits.StartService();
  681. }
  682. catch (...)
  683. {
  684. ASSERT(FALSE);
  685. }
  686. return;
  687. }
  688. void CGameServerDlg::OnBnClickedStopService()
  689. {
  690. int iRet = MessageBox(L"确定关闭吗?", L"真的确定关闭我吗", MB_YESNO);
  691. if (IDYES != iRet)
  692. {
  693. return;
  694. }
  695. //停止服务
  696. try
  697. {
  698. StopService();
  699. }
  700. catch (...)
  701. {
  702. ASSERT(FALSE);
  703. }
  704. return;
  705. }
  706. void CGameServerDlg::OnBnClickedOpenServer()
  707. {
  708. //变量定义
  709. tagDataBaseParameter DataBaseParameter;
  710. ZeroMemory(&DataBaseParameter, sizeof(DataBaseParameter));
  711. //设置参数
  712. InitDataBaseParameter(DataBaseParameter);
  713. m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter);
  714. //配置房间
  715. CDlgServerItem DlgServerItem;
  716. DlgServerItem.g_StartP = g_StartP; //启动参数
  717. if (DlgServerItem.OpenGameServer() == false) return;
  718. //更新状态
  719. UpdateParameterStatus(DlgServerItem.m_ModuleInitParameter);
  720. return;
  721. }
  722. void CGameServerDlg::OnBnClickedOpenMatch()
  723. {
  724. // TODO: 在此添加控件通知处理程序代码
  725. }
  726. void CGameServerDlg::OnBnClickedCreateServer()
  727. {
  728. //变量定义
  729. tagDataBaseParameter DataBaseParameter;
  730. ZeroMemory(&DataBaseParameter, sizeof(DataBaseParameter));
  731. //设置参数
  732. InitDataBaseParameter(DataBaseParameter);
  733. m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter);
  734. //创建房间
  735. CDlgServerWizard DlgServerWizard;
  736. if (DlgServerWizard.CreateGameServer() == false) return;
  737. //更新状态
  738. UpdateParameterStatus(DlgServerWizard.m_ModuleInitParameter);
  739. return;
  740. }
  741. void CGameServerDlg::OnBnClickedOptionServer()
  742. {
  743. //游戏模块
  744. CGameServiceManagerHelper GameServiceManager;
  745. GameServiceManager.SetModuleCreateInfo(m_ModuleInitParameter.GameServiceAttrib.szServerDLLName, GAME_SERVICE_CREATE_NAME);
  746. //加载模块
  747. if (GameServiceManager.CreateInstance() == false)
  748. {
  749. AfxMessageBox(TEXT("服务组件不存在或者加载失败,配置房间失败"), MB_ICONERROR);
  750. return;
  751. }
  752. //配置房间
  753. CDlgServerWizard DlgServerWizard;
  754. DlgServerWizard.SetWizardParameter(GameServiceManager.GetInterface(), &m_ModuleInitParameter.GameServiceOption);
  755. //创建房间
  756. if (DlgServerWizard.CreateGameServer() == false) return;
  757. //更新状态
  758. UpdateParameterStatus(DlgServerWizard.m_ModuleInitParameter);
  759. return;
  760. }
  761. void CGameServerDlg::OnBnClickedOptionMatch()
  762. {
  763. //不是比赛就过滤
  764. if ((m_ModuleInitParameter.GameServiceOption.wServerType&GAME_GENRE_MATCH) == 0) return;
  765. //变量定义
  766. tagDataBaseParameter DataBaseParameter;
  767. ZeroMemory(&DataBaseParameter, sizeof(DataBaseParameter));
  768. //设置参数
  769. InitDataBaseParameter(DataBaseParameter);
  770. m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter);
  771. //配置房间
  772. CDlgServerMatch DlgServerMatch;
  773. if (DlgServerMatch.OpenGameMatch(m_ModuleInitParameter.GameServiceAttrib.wKindID) == false) return;
  774. //拷贝数据
  775. CopyMemory(&m_ModuleInitParameter.GameMatchOption, &DlgServerMatch.m_GameMatchOption, sizeof(m_ModuleInitParameter.GameMatchOption));
  776. //配置游戏
  777. m_ServiceUnits.CollocateService(m_ModuleInitParameter.GameMatchOption, m_ModuleInitParameter.vecVenueInfo);
  778. //输出信息
  779. CTraceService::TraceString(TEXT("比赛配置加载成功"), TraceLevel_Normal);
  780. }
  781. //加载配置
  782. VOID CGameServerDlg::LoadInitParameter()
  783. {
  784. //获取路径
  785. TCHAR szWorkDir[MAX_PATH] = TEXT("");
  786. CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir));
  787. //构造路径
  788. TCHAR szIniFile[MAX_PATH] = TEXT("");
  789. _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\Parameter.ini"), szWorkDir);
  790. //读取配置
  791. CWHIniData IniData;
  792. IniData.SetIniFilePath(szIniFile);
  793. g_StartP.iLevel = IniData.ReadInt(TEXT("Server"), TEXT("Level"), 1);
  794. g_StartP.iAuto = IniData.ReadInt(TEXT("Server"), TEXT("Auto"), 0);
  795. g_StartP.wServerID = IniData.ReadInt(TEXT("Server"), TEXT("ServerID"), 0);
  796. CGameServerDlg::g_bGameLog = IniData.ReadInt(TEXT("Gamelog"), TEXT("ServerID"), 1);
  797. IniData.ReadString(TEXT("SYS"), TEXT("守护进程"), TEXT(""), g_StartP.szShouHu, CountArray(g_StartP.szShouHu));
  798. IniData.ReadString(TEXT("SYS"), TEXT("策略获取地址"), TEXT(""), g_StartP.szCeLv, CountArray(g_StartP.szCeLv));
  799. switch (g_StartP.iLevel)
  800. {
  801. case 1:
  802. mListBox.SetCurSel(0);
  803. break;
  804. case 2:
  805. mListBox.SetCurSel(1);
  806. break;
  807. case 3:
  808. mListBox.SetCurSel(2);
  809. break;
  810. case 4:
  811. mListBox.SetCurSel(3);
  812. break;
  813. case 5:
  814. mListBox.SetCurSel(4);
  815. break;
  816. case 6:
  817. mListBox.SetCurSel(5);
  818. break;
  819. case 7:
  820. mListBox.SetCurSel(6);
  821. break;
  822. case 8:
  823. mListBox.SetCurSel(7);
  824. break;
  825. default:
  826. break;
  827. }
  828. ((CButton*)GetDlgItem(IDC_CHECK6))->SetCheck(g_StartP.iAuto);
  829. if (g_StartP.iAuto == 1) SetTimer(2, 3000, NULL); //自动化调用
  830. return;
  831. }
  832. void CGameServerDlg::OnTimer(UINT_PTR nIDEvent)
  833. {
  834. // TODO: 在此添加消息处理程序代码和/或调用默认值
  835. if (nIDEvent == 1)
  836. {
  837. CTime End = CTime::GetCurrentTime();
  838. CTimeSpan csTest = End - m_StartTime;
  839. CString csTime = m_StartTime.Format(_T("%Y-%m-%d %H:%M:%S"));
  840. CString csTime1 = End.Format(_T("%Y-%m-%d %H:%M:%S"));
  841. int a, b, c,d;
  842. a = csTest.GetHours();
  843. b = csTest.GetMinutes();
  844. c = csTest.GetSeconds();
  845. d = csTest.GetTotalHours() / 24;
  846. CString cs;
  847. cs.Format(L"%ld天 %2ld:%2ld:%2ld", d, a, b, c);
  848. i1.SetWindowText(cs);
  849. }
  850. else if (nIDEvent == 2)
  851. {
  852. KillTimer(nIDEvent);
  853. CGameServerDlg::OnBnClickedOpenServer();
  854. if (g_StartP.iAuto == 1
  855. && g_StartP.iErr == 0)
  856. {
  857. OnBnClickedStartService();
  858. }
  859. else
  860. {
  861. if (g_StartP.iAuto == 1
  862. && g_StartP.iErr == -2)
  863. {
  864. CTraceService::TraceString(TEXT("未找指定节点的服务器信息"), TraceLevel_Warning);
  865. }
  866. }
  867. }
  868. else if (nIDEvent == 100)
  869. {
  870. if (m_Data.iPlayingTableCount == 0)
  871. {
  872. KillTimer(nIDEvent);
  873. //检测人数是否已经退出,若都退出则关闭。
  874. DWORD dwProcessID = NULL;
  875. if (!StatisticalUser::GetTokenByName(dwProcessID, g_StartP.szShouHu))
  876. {
  877. CTraceService::TraceString(TEXT("未找守护进程,无法回报信息。"), TraceLevel_Warning);
  878. return;
  879. }
  880. CList<HWND> mList;
  881. if (!StatisticalUser::GetWindowHwndByPid(dwProcessID, mList))
  882. {
  883. CTraceService::TraceString(TEXT("未找守护进程对应的窗口,无法回报信息。"), TraceLevel_Warning);
  884. return;
  885. }
  886. StopService();
  887. Sleep(100);
  888. CString csTest;
  889. csTest.Format(L"守护进程包含 %d 个窗口,任务ID:%d,实例ID:%d", mList.GetCount(), iRenWuID, g_StartP.wServerID);
  890. CTraceService::TraceString(csTest, TraceLevel_Normal);
  891. //发送信息
  892. POSITION pos = mList.GetTailPosition();
  893. CString data;
  894. while (pos != NULL)
  895. {
  896. HWND hHandle = mList.GetNext(pos);
  897. DWORD dRet = ::SendMessage(hHandle, WM_MYMSGACK, iRenWuID, g_StartP.wServerID);
  898. DWORD dLastID = GetLastError();
  899. CString csTest;
  900. csTest.Format(L"发送消息返回:%d,LastID:%d", dRet, dLastID);
  901. CTraceService::TraceString(csTest, TraceLevel_Normal);
  902. }
  903. }
  904. }
  905. else if (nIDEvent == 101)
  906. {
  907. KillTimer(nIDEvent);
  908. //30分钟后,强制关闭
  909. DWORD dwProcessID = NULL;
  910. if (!StatisticalUser::GetTokenByName(dwProcessID, g_StartP.szShouHu))
  911. {
  912. CTraceService::TraceString(TEXT("未找守护进程,无法回报信息。"), TraceLevel_Warning);
  913. return;
  914. }
  915. CList<HWND> mList;
  916. if (!StatisticalUser::GetWindowHwndByPid(dwProcessID, mList))
  917. {
  918. CTraceService::TraceString(TEXT("未找守护进程对应的窗口,无法回报信息。"), TraceLevel_Warning);
  919. return;
  920. }
  921. StopService();
  922. Sleep(100);
  923. CString csTest;
  924. csTest.Format(L"守护进程包含 %d 个窗口,任务ID:%d,实例ID:%d", mList.GetCount(), iRenWuID, g_StartP.wServerID);
  925. CTraceService::TraceString(csTest, TraceLevel_Normal);
  926. //发送信息
  927. POSITION pos = mList.GetTailPosition();
  928. CString data;
  929. while (pos != NULL)
  930. {
  931. HWND hHandle = mList.GetNext(pos);
  932. ::SendMessage(hHandle, WM_MYMSGACK, iRenWuID, g_StartP.wServerID);
  933. }
  934. }
  935. __super::OnTimer(nIDEvent);
  936. }
  937. //发布全服公告
  938. void CGameServerDlg::OnSendGongGaoButton1()
  939. {
  940. // TODO: 在此添加控件通知处理程序代码
  941. CMD_GR_SendMessage SysMessage;
  942. ZeroMemory(&SysMessage, sizeof(SysMessage));
  943. CString csTest;
  944. j4.GetWindowText(csTest);
  945. if (csTest.GetLength() == 0 || csTest.GetLength() > 128)
  946. {
  947. MessageBox(L"发布信息长度不能为空,或大于128个字节。");
  948. return;
  949. }
  950. // TODO: 在此添加控件通知处理程序代码
  951. DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck();
  952. if (BST_UNCHECKED == dwState)
  953. {
  954. SysMessage.cbLoop = FALSE;
  955. }
  956. else
  957. {
  958. SysMessage.cbLoop = TRUE;
  959. }
  960. dwState = ((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck();
  961. if (BST_UNCHECKED == dwState)
  962. {
  963. SysMessage.cbAllRoom = TRUE;
  964. }
  965. else
  966. {
  967. SysMessage.cbAllRoom = FALSE;
  968. }
  969. SysMessage.cbGame = TRUE;
  970. SysMessage.cbRoom = TRUE;
  971. //读取时间
  972. SYSTEMTIME systime;
  973. ZeroMemory(&systime, sizeof(systime));
  974. int iHouMiao = 15;
  975. int iHouXunHuan = j3.GetCurSel();
  976. switch (iHouXunHuan)
  977. {
  978. case 0:
  979. iHouMiao = 15;
  980. break;
  981. case 1:
  982. iHouMiao = 30;
  983. break;
  984. case 2:
  985. iHouMiao = 45;
  986. break;
  987. case 3:
  988. iHouMiao = 60;
  989. break;
  990. case 4:
  991. iHouMiao = 120;
  992. break;
  993. case 5:
  994. iHouMiao = 3600;
  995. break;
  996. case 6:
  997. iHouMiao = 3600 * 24;
  998. break;
  999. default:
  1000. break;
  1001. }
  1002. int iMiao = 5;
  1003. int iXunHuan = j2.GetCurSel();
  1004. switch (iXunHuan)
  1005. {
  1006. case 0:
  1007. iMiao = 5;
  1008. break;
  1009. case 1:
  1010. iMiao = 10;
  1011. break;
  1012. case 2:
  1013. iMiao = 15;
  1014. break;
  1015. case 3:
  1016. iMiao = 20;
  1017. break;
  1018. case 4:
  1019. iMiao = 30;
  1020. break;
  1021. case 5:
  1022. iMiao = 60;
  1023. break;
  1024. case 6:
  1025. iMiao = 3600;
  1026. break;
  1027. default:
  1028. break;
  1029. }
  1030. int iEndXunHuan = j3.GetCurSel();
  1031. CTime ConcludeTime(systime);
  1032. SysMessage.tConcludeTime = ConcludeTime.GetTime() + 1000 * iHouMiao;
  1033. SysMessage.dwTimeRate = 1000 * iMiao;
  1034. StringCchCat(SysMessage.szSystemMessage, _countof(SysMessage.szSystemMessage), csTest/*.GetBuffer()*/);
  1035. SysMessage.wChatLength = (_countof(SysMessage.szSystemMessage));
  1036. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_GG, 0, &SysMessage, sizeof(SysMessage));
  1037. }
  1038. void CGameServerDlg::OnBnClickedButton2()
  1039. {
  1040. // TODO: 在此添加控件通知处理程序代码
  1041. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_STOP_GG, NULL, 0, 0);
  1042. }
  1043. void CGameServerDlg::OnBnHotItemChangeCheck2(NMHDR *pNMHDR, LRESULT *pResult)
  1044. {
  1045. // 此功能要求 Internet Explorer 6 或更高版本。
  1046. // 符号 _WIN32_IE 必须是 >= 0x0600。
  1047. LPNMBCHOTITEM pHotItem = reinterpret_cast<LPNMBCHOTITEM>(pNMHDR);
  1048. // TODO: 在此添加控件通知处理程序代码
  1049. *pResult = 0;
  1050. }
  1051. void CGameServerDlg::OnBnClickedCheck2()
  1052. {
  1053. // TODO: 在此添加控件通知处理程序代码
  1054. DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK2))->GetCheck();
  1055. if (BST_UNCHECKED == dwState)
  1056. {
  1057. int iRet = 0;
  1058. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_CJ, 0, &iRet, sizeof(int));
  1059. }
  1060. else
  1061. {
  1062. int iRet = 1;
  1063. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_CJ, 0, &iRet, sizeof(int));
  1064. }
  1065. }
  1066. void CGameServerDlg::OnBnClickedCheck3()
  1067. {
  1068. // TODO: 在此添加控件通知处理程序代码
  1069. DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK3))->GetCheck();
  1070. if (BST_UNCHECKED == dwState)
  1071. {
  1072. int iRet = 0;
  1073. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JR, 0, &iRet, sizeof(int));
  1074. }
  1075. else
  1076. {
  1077. int iRet = 1;
  1078. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JR, 0, &iRet, sizeof(int));
  1079. }
  1080. }
  1081. //强制解散空闲房间
  1082. void CGameServerDlg::OnBnClickedButton7()
  1083. {
  1084. // TODO: 在此添加控件通知处理程序代码
  1085. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JSFREEALL, 0, NULL, 0);
  1086. }
  1087. void CGameServerDlg::OnBnClickedButton4()
  1088. {
  1089. // TODO: 在此添加控件通知处理程序代码
  1090. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JSGAMEALL, 0, NULL, 0);
  1091. }
  1092. void CGameServerDlg::OnBnClickedCheck4()
  1093. {
  1094. // TODO: 在此添加控件通知处理程序代码
  1095. DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK4))->GetCheck();
  1096. if (BST_UNCHECKED == dwState)
  1097. {
  1098. int iRet = 0;
  1099. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_WORK, 0, &iRet, sizeof(int));
  1100. }
  1101. else
  1102. {
  1103. int iRet = 1;
  1104. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_WORK, 0, &iRet, sizeof(int));
  1105. }
  1106. }
  1107. void CGameServerDlg::OnBnClickedCheck7()
  1108. {
  1109. // TODO: 在此添加控件通知处理程序代码
  1110. DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK7))->GetCheck();
  1111. if (BST_UNCHECKED == dwState)
  1112. {
  1113. int iRet = 0;
  1114. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_HUA_CREATE, 0, &iRet, sizeof(int));
  1115. }
  1116. else
  1117. {
  1118. int iRet = 1;
  1119. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_HUA_CREATE, 0, &iRet, sizeof(int));
  1120. }
  1121. }
  1122. void CGameServerDlg::OnBnClickedButton5()
  1123. {
  1124. // TODO: 在此添加控件通知处理程序代码
  1125. CString csRoomID;
  1126. j5.GetWindowText(csRoomID);
  1127. int iRet = _wtol(csRoomID/*.GetBuffer()*/);
  1128. if (iRet> 999999 || iRet < 100000)
  1129. {
  1130. MessageBox(L"输入房间号不正确");
  1131. return;
  1132. }
  1133. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JSROOM,0, &iRet, sizeof(int));
  1134. }
  1135. void CGameServerDlg::OnBnClickedButton6()
  1136. {
  1137. // TODO: 在此添加控件通知处理程序代码
  1138. CString csUserID;
  1139. j6.GetWindowText(csUserID);
  1140. int iRet = _wtol(csUserID/*.GetBuffer()*/);
  1141. if (iRet> 999999 || iRet < 100000)
  1142. {
  1143. MessageBox(L"输入UID不正确");
  1144. return;
  1145. }
  1146. //csUserID.ReleaseBuffer();
  1147. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_SHUTDOWN_USER,0, &iRet, sizeof(int));
  1148. }
  1149. void CGameServerDlg::OnBnClickedButton3()
  1150. {
  1151. // TODO: 在此添加控件通知处理程序代码
  1152. CString csTest;
  1153. j7.GetWindowText(csTest);
  1154. int iRet = _wtol(csTest/*.GetBuffer()*/);
  1155. if (iRet<0)
  1156. {
  1157. MessageBox(L"输入UID不正确");
  1158. return;
  1159. }
  1160. //csTest.ReleaseBuffer();
  1161. int iNum = bbb.GetCount();
  1162. if (iNum >20)
  1163. {
  1164. MessageBox(L"最多只能监测20个用户");
  1165. return;
  1166. }
  1167. bbb.InsertString(iNum, csTest);
  1168. }
  1169. void CGameServerDlg::OnBnClickedButton8()
  1170. {
  1171. // TODO: 在此添加控件通知处理程序代码
  1172. bbb.ResetContent();
  1173. }
  1174. void CGameServerDlg::OnBnClickedCheck5()
  1175. {
  1176. // TODO: 在此添加控件通知处理程序代码
  1177. DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK5))->GetCheck();
  1178. DWORD dUserID[20];
  1179. ZeroMemory(dUserID, sizeof(DWORD) * 20);
  1180. if (BST_UNCHECKED == dwState)
  1181. {
  1182. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JC, 0, NULL, 0);
  1183. }
  1184. else
  1185. {
  1186. if (bbb.GetCount() == 0)
  1187. {
  1188. ((CButton*)GetDlgItem(IDC_CHECK5))->SetCheck(false);
  1189. MessageBox(L"请添加监测ID");
  1190. return;
  1191. }
  1192. for (int i = 0; i < bbb.GetCount(); i++)
  1193. {
  1194. CString csTest;
  1195. bbb.GetText(i, csTest);
  1196. int iRet = _wtol(csTest);
  1197. dUserID[i] = iRet;
  1198. }
  1199. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JC, 0, dUserID, sizeof(DWORD) * 20);
  1200. }
  1201. }
  1202. void CGameServerDlg::OnLbnSelchangeList2()
  1203. {
  1204. // TODO: 在此添加控件通知处理程序代码
  1205. int nIndex = ccc.GetCurSel();
  1206. if (nIndex != LB_ERR)
  1207. {
  1208. CString csTest = L"0";
  1209. ccc.GetText(nIndex, csTest);
  1210. int d = _wtol(csTest);
  1211. (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_FIND, 0, &d, sizeof(int));
  1212. }
  1213. }
  1214. void CGameServerDlg::OnBnClickedCheck6()
  1215. {
  1216. // TODO: 在此添加控件通知处理程序代码
  1217. DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK6))->GetCheck();
  1218. if (BST_UNCHECKED == dwState)
  1219. {
  1220. g_StartP.iAuto = 0;
  1221. TCHAR szWorkDir[MAX_PATH] = TEXT("");
  1222. CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir));
  1223. //构造路径
  1224. TCHAR szIniFile[MAX_PATH] = TEXT("");
  1225. _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\Parameter.ini"), szWorkDir);
  1226. //保存
  1227. BOOL bRet = WritePrivateProfileString(TEXT("Server"), TEXT("Auto"), L"0", szIniFile);
  1228. }
  1229. else
  1230. {
  1231. g_StartP.iAuto = 1;
  1232. TCHAR szWorkDir[MAX_PATH] = TEXT("");
  1233. CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir));
  1234. //构造路径
  1235. TCHAR szIniFile[MAX_PATH] = TEXT("");
  1236. _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\Parameter.ini"), szWorkDir);
  1237. //保存
  1238. BOOL bRet = WritePrivateProfileString(TEXT("Server"), TEXT("Auto"), L"1", szIniFile);
  1239. }
  1240. }
  1241. int CGameServerDlg::StopService()
  1242. {
  1243. KillTimer(1);
  1244. m_ServiceUnits.ConcludeService();
  1245. //启用共享内存
  1246. HANDLE m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _T("GAMESERVERINFOG__"));
  1247. if (m_hMapFile)
  1248. {
  1249. //显示共享的文件数据。
  1250. LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  1251. HINSTANCE hInst = NULL;
  1252. hInst = AfxGetApp()->m_hInstance;
  1253. TCHAR path_buffer[_MAX_PATH] = { 0 };
  1254. GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径
  1255. GAMESERVERINFOALL *pBuffer = (GAMESERVERINFOALL *)lpMapAddr;
  1256. //检测当前节点是否存在
  1257. if (pBuffer->iNum > 20)
  1258. {
  1259. return -1;
  1260. }
  1261. //查找节点是否已经存在
  1262. for (int i = 0; i < pBuffer->iNum; i++)
  1263. {
  1264. if (pBuffer->Data[i].dServerID == g_StartP.wServerID)
  1265. {
  1266. StringCchCopy(pBuffer->Data[i].szPath, 256, path_buffer);
  1267. pBuffer->Data[i].iStat = -1;
  1268. pBuffer->Data[i].Pid = 0;
  1269. FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1);
  1270. }
  1271. }
  1272. }
  1273. return 0;
  1274. }
  1275. void CGameServerDlg::OnBnClickedButton9()
  1276. {
  1277. // TODO: 在此添加控件通知处理程序代码
  1278. HANDLE m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _T("GAMESERVERINFOG__"));
  1279. if (m_hMapFile)
  1280. {
  1281. //显示共享的文件数据。
  1282. LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  1283. HINSTANCE hInst = NULL;
  1284. hInst = AfxGetApp()->m_hInstance;
  1285. TCHAR path_buffer[_MAX_PATH] = { 0 };
  1286. GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径
  1287. GAMESERVERINFOALL *pBuffer = (GAMESERVERINFOALL *)lpMapAddr;
  1288. ZeroMemory(pBuffer, sizeof(GAMESERVERINFOALL));
  1289. FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1);
  1290. }
  1291. }