// GameServerDlg.cpp : 实现文件 // #include "stdafx.h" #include "GameServer.h" #include "GameServerDlg.h" #include "afxdialogex.h" #include "..\..\..\Games\Normal\松滋晃晃血流\消息定义\CMD_Sparrow.h" #include "BaiDuMap.h" #include "StatisticalUser.h" #ifdef _DEBUG #define new DEBUG_NEW #endif //消息定义 #define WM_PROCESS_CMD_LINE (WM_USER+100) //处理命令 #define WM_MY_CMD_LINE (WM_USER+101) //更新数据 #define WM_MYMSG (WM_USER+110) //禁止加入房间与禁止分配 #define WM_MYMSGACK (WM_USER+111) //禁止加入房间与禁止分配的结果回复 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CGameServerDlg 对话框 STARTP CGameServerDlg::g_StartP; bool CGameServerDlg::g_bGameLog = true; CGameServerDlg::CGameServerDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CGameServerDlg::IDD, pParent) { ZeroMemory(&m_Data, sizeof(m_Data)); m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); iRenWuID = 0; } void CGameServerDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_TRACE_MESSAGE, m_TraceServiceControl); DDX_Control(pDX, IDC_COMBO1, mListBox); DDX_Control(pDX, IDC_GAME_NAME2, a1); DDX_Control(pDX, IDC_SERVER_PORT2, a2); DDX_Control(pDX, IDC_GAME_NAME3, b1); DDX_Control(pDX, IDC_SERVER_PORT3, b2); DDX_Control(pDX, IDC_GAME_NAME4, c1); DDX_Control(pDX, IDC_SERVER_PORT4, c2); DDX_Control(pDX, IDC_GAME_NAME5, d1); DDX_Control(pDX, IDC_SERVER_PORT5, d2); DDX_Control(pDX, IDC_GAME_NAME6, e1); DDX_Control(pDX, IDC_SERVER_PORT6, e2); DDX_Control(pDX, IDC_GAME_NAME7, f1); DDX_Control(pDX, IDC_SERVER_PORT7, f2); DDX_Control(pDX, IDC_GAME_NAME8, g1); DDX_Control(pDX, IDC_SERVER_PORT8, g2); DDX_Control(pDX, IDC_GAME_NAME9, h1); DDX_Control(pDX, IDC_SERVER_PORT9, h2); DDX_Control(pDX, IDC_GAME_NAME10, i1); DDX_Control(pDX, IDC_SERVER_PORT10, i2); DDX_Control(pDX, IDC_GAME_NAME11, j1); DDX_Control(pDX, IDC_GAME_NAME12, game1); DDX_Control(pDX, IDC_GAME_NAME13, game2); DDX_Control(pDX, IDC_GAME_NAME14, game3); DDX_Control(pDX, IDC_GAME_NAME15, game4); DDX_Control(pDX, IDC_GAME_NAME16, game5); DDX_Control(pDX, IDC_GAME_NAME17, game6); DDX_Control(pDX, IDC_GAME_NAME18, game7); DDX_Control(pDX, IDC_GAME_NAME19, game8); DDX_Control(pDX, IDC_COMBO2, j2); DDX_Control(pDX, IDC_COMBO3, j3); DDX_Control(pDX, IDC_EDIT1, j4); DDX_Control(pDX, IDC_EDIT2, j5); DDX_Control(pDX, IDC_EDIT3, j6); DDX_Control(pDX, IDC_EDIT4, j7); DDX_Control(pDX, IDC_LIST1, bbb); DDX_Control(pDX, IDC_LIST2, ccc); ///---桌子列表 } BEGIN_MESSAGE_MAP(CGameServerDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_QUERYENDSESSION() ON_BN_CLICKED(IDC_START_SERVICE, &CGameServerDlg::OnBnClickedStartService) ON_BN_CLICKED(IDC_STOP_SERVICE, &CGameServerDlg::OnBnClickedStopService) ON_BN_CLICKED(IDC_OPEN_SERVER, &CGameServerDlg::OnBnClickedOpenServer) ON_BN_CLICKED(IDC_OPEN_MATCH, &CGameServerDlg::OnBnClickedOpenMatch) ON_BN_CLICKED(IDC_CREATE_SERVER, &CGameServerDlg::OnBnClickedCreateServer) ON_BN_CLICKED(IDC_OPTION_SERVER, &CGameServerDlg::OnBnClickedOptionServer) ON_BN_CLICKED(IDC_OPTION_MATCH, &CGameServerDlg::OnBnClickedOptionMatch) ON_MESSAGE(WM_PROCESS_CMD_LINE, &CGameServerDlg::OnMessageProcessCmdLine) ON_MESSAGE(WM_MY_CMD_LINE, &CGameServerDlg::OnMessageUpdata) ON_MESSAGE(WM_MYMSG, &CGameServerDlg::OnMessageStop) ON_WM_TIMER() ON_BN_CLICKED(IDC_BUTTON1, &CGameServerDlg::OnSendGongGaoButton1) ON_BN_CLICKED(IDC_BUTTON2, &CGameServerDlg::OnBnClickedButton2) ON_NOTIFY(BCN_HOTITEMCHANGE, IDC_CHECK2, &CGameServerDlg::OnBnHotItemChangeCheck2) ON_BN_CLICKED(IDC_CHECK2, &CGameServerDlg::OnBnClickedCheck2) ON_BN_CLICKED(IDC_CHECK3, &CGameServerDlg::OnBnClickedCheck3) ON_BN_CLICKED(IDC_BUTTON7, &CGameServerDlg::OnBnClickedButton7) ON_BN_CLICKED(IDC_BUTTON4, &CGameServerDlg::OnBnClickedButton4) ON_BN_CLICKED(IDC_CHECK4, &CGameServerDlg::OnBnClickedCheck4) ON_BN_CLICKED(IDC_BUTTON5, &CGameServerDlg::OnBnClickedButton5) ON_BN_CLICKED(IDC_BUTTON6, &CGameServerDlg::OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON3, &CGameServerDlg::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON8, &CGameServerDlg::OnBnClickedButton8) ON_BN_CLICKED(IDC_CHECK5, &CGameServerDlg::OnBnClickedCheck5) ON_LBN_SELCHANGE(IDC_LIST2, &CGameServerDlg::OnLbnSelchangeList2) ON_BN_CLICKED(IDC_CHECK6, &CGameServerDlg::OnBnClickedCheck6) ON_BN_CLICKED(IDC_CHECK7, &CGameServerDlg::OnBnClickedCheck7) ON_BN_CLICKED(IDC_BUTTON9, &CGameServerDlg::OnBnClickedButton9) END_MESSAGE_MAP() // CGameServerDlg 消息处理程序 BOOL CGameServerDlg::OnInitDialog() { CDialogEx::OnInitDialog(); //设置标题 SetWindowText(TEXT("游戏服务器 -- [ 停止 ]")); // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 //设置组件 m_ServiceUnits.SetServiceUnitsSink(this); mListBox.InsertString(0, _T("一级(红名服务器)")); mListBox.InsertString(1, _T("二级(默认服务器)")); mListBox.InsertString(2, _T("VIP一级")); mListBox.InsertString(3, _T("VIP二级")); mListBox.InsertString(4, _T("VIP三级")); mListBox.InsertString(5, _T("VIP四级")); mListBox.InsertString(6, _T("VIP五级")); mListBox.InsertString(7, _T("VIP六级")); j2.InsertString(0, _T("五秒循环一次")); j2.InsertString(1, _T("十秒循环一次")); j2.InsertString(2, _T("十五秒循环一次")); j2.InsertString(3, _T("二十秒循环一次")); j2.InsertString(4, _T("三十秒循环一次")); j2.InsertString(5, _T("一分钟循环一次")); j2.InsertString(6, _T("一小时循环一次")); j2.SetCurSel(0); j3.InsertString(0, _T("十五秒后")); j3.InsertString(1, _T("三十秒后")); j3.InsertString(2, _T("四十五秒后")); j3.InsertString(3, _T("六十秒后")); j3.InsertString(4, _T("一百二十秒后")); j3.InsertString(5, _T("一小时后")); j3.InsertString(6, _T("一天后")); j3.SetCurSel(0); CButton *pCheckbox = (CButton*)GetDlgItem(IDC_CHECK1); pCheckbox->SetCheck(true); pCheckbox = (CButton*)GetDlgItem(IDC_RADIO2); pCheckbox->SetCheck(true); ((CButton*)GetDlgItem(IDC_CHECK2))->SetCheck(true); ((CButton*)GetDlgItem(IDC_CHECK3))->SetCheck(true); ((CButton*)GetDlgItem(IDC_CHECK4))->SetCheck(true); ((CButton*)GetDlgItem(IDC_CHECK7))->SetCheck(true); LoadInitParameter(); StatisticalUser::EnablePriv(); //SetTimer(100, 1000, NULL); //命令处理 LPCTSTR pszCmdLine = AfxGetApp()->m_lpCmdLine; if (pszCmdLine[0] != 0) PostMessage(WM_PROCESS_CMD_LINE, 0, (LPARAM)pszCmdLine); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } BOOL CGameServerDlg::UpData(TagUpData Data) { CGameServerDlg *pCGameServerDlg = (CGameServerDlg *)theApp.m_pMainWnd; pCGameServerDlg->m_Data = Data; if (pCGameServerDlg) pCGameServerDlg->PostMessage(WM_MY_CMD_LINE, 0, (LPARAM)&(pCGameServerDlg->m_Data)); return TRUE; } void CGameServerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CGameServerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CGameServerDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } BOOL CGameServerDlg::OnQueryEndSession() { if (!CDialogEx::OnQueryEndSession()) return FALSE; // TODO: 在此添加专用的查询结束会话代码 return TRUE; } void CGameServerDlg::OnCancel() { //关闭询问 if (m_ServiceUnits.GetServiceStatus() != ServiceStatus_Stop) { LPCTSTR pszQuestion = TEXT("游戏服务器正在运行中,您确实要关闭服务器吗?"); if (AfxMessageBox(pszQuestion, MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION) != IDYES) return; } //停止服务 StopService(); __super::OnCancel(); } void CGameServerDlg::OnOK() { return; } BOOL CGameServerDlg::PreTranslateMessage(MSG* pMsg) { //按键过滤 if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_ESCAPE)) { return TRUE; } return __super::PreTranslateMessage(pMsg); } //停止业务 LRESULT CGameServerDlg::OnMessageStop(WPARAM wParam, LPARAM lParam) { WORD wTest = lParam; if (wTest != g_StartP.wServerID) { return 0; } iRenWuID = wParam;//任务ID //停止业务 ((CButton*)GetDlgItem(IDC_CHECK2))->SetCheck(0); ((CButton*)GetDlgItem(IDC_CHECK4))->SetCheck(0); ((CButton*)GetDlgItem(IDC_CHECK7))->SetCheck(0); int iRet = 0; (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_CJ, 0, &iRet, sizeof(int)); (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_WORK, 0, &iRet, sizeof(int)); (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_HUA_CREATE, 0, &iRet, sizeof(int)); //启动定时器检测停止结果 SetTimer(100, 10 * 1000, NULL); //强制关闭时间 SetTimer(101, 30 * 60 * 1000, NULL); return 0L; } LRESULT CGameServerDlg::OnMessageUpdata(WPARAM wParam, LPARAM lParam) { CTime Now = CTime::GetCurrentTime(); CString csTime = Now.Format(_T("%Y-%m-%d %H:%M:%S")); i2.SetWindowText(csTime); ///---上次上报 CString csTest; csTest.Format(L"%d", m_Data.iTableCount); a1.SetWindowText(csTest); csTest.Format(L"%d", m_Data.iPlayingTableCount); a2.SetWindowText(csTest); csTest.Format(L"%d", m_Data.iFreeTableCount); b1.SetWindowText(csTest); csTest.Format(L"%d", m_Data.iDownTableCount); b2.SetWindowText(csTest); csTest.Format(L"%d", m_Data.iLoginBody); c1.SetWindowText(csTest); csTest.Format(L"%d", m_Data.iDownBody); c2.SetWindowText(csTest); csTest.Format(L"%d", m_Data.iDaTingBody); d1.SetWindowText(csTest); csTest.Format(L"%d", m_Data.iLinkBody); d2.SetWindowText(csTest); csTest.Format(L"%d", m_Data.iSocketNum); e1.SetWindowText(csTest); csTest.Format(L"%d", m_Data.iErrQ); e2.SetWindowText(csTest); csTest.Format(L"%d", m_Data.iFreeCon); f1.SetWindowText(csTest); csTest.Format(L"%d", m_Data.iQNum); f2.SetWindowText(csTest); csTest.Format(L"%d/%d", m_Data.dLoginQ, m_Data.dLoginQOK); g1.SetWindowText(csTest); csTest.Format(L"%d/%d", m_Data.dChongZhi, m_Data.dChongZhiOK); g2.SetWindowText(csTest); csTest.Format(L"%d", m_Data.dCreateTable); h1.SetWindowText(csTest); csTest.Format(L"%d/%d", m_Data.dAddRoom, m_Data.dAddRoomChange); h2.SetWindowText(csTest); csTest.Format(L"%d", m_Data.dLoginDuanXianOK); j1.SetWindowText(csTest); ccc.ResetContent(); for (int i = 0; i < m_Data.iTableCount; i++) { csTest.Format(L"%d", m_Data.PrivteTable[i]); ccc.InsertString(i, csTest); } return 0L; } LRESULT CGameServerDlg::OnMessageProcessCmdLine(WPARAM wParam, LPARAM lParam) { //变量定义 CWHCommandLine CommandLine; LPCTSTR pszCommandLine = (LPCTSTR)(lParam); //房间标识 TCHAR szSrverID[32] = TEXT(""); if (CommandLine.SearchCommandItem(pszCommandLine, TEXT("/ServerID:"), szSrverID, CountArray(szSrverID)) == true) { //获取房间 WORD wServerID = (WORD)(_tstol(szSrverID)); //启动房间 if (wServerID != 0) { //设置变量 m_bAutoControl = true; //启动房间 StartServerService(wServerID); } } return 0L; } VOID CGameServerDlg::OnServiceUnitsStatus(enServiceStatus ServiceStatus) { //状态设置 switch (ServiceStatus) { case ServiceStatus_Stop: //停止状态 { //更新标题 UpdateServerTitle(ServiceStatus); //服务按钮 GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(FALSE); GetDlgItem(IDC_START_SERVICE)->EnableWindow(TRUE); //配置按钮 GetDlgItem(IDC_OPEN_MATCH)->EnableWindow(TRUE); GetDlgItem(IDC_OPEN_SERVER)->EnableWindow(TRUE); GetDlgItem(IDC_CREATE_SERVER)->EnableWindow(TRUE); GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(TRUE); if ((m_ModuleInitParameter.GameServiceOption.wServerType&GAME_GENRE_MATCH) != 0) GetDlgItem(IDC_OPTION_MATCH)->EnableWindow(TRUE); //运行按钮 GetDlgItem(IDC_RUN_PARAMETER)->EnableWindow(FALSE); GetDlgItem(IDC_SERVICE_CONTROL)->EnableWindow(FALSE); //提示信息 LPCTSTR pszDescribe = TEXT("服务停止成功"); CTraceService::TraceString(pszDescribe, TraceLevel_Normal); break; } case ServiceStatus_Config: //配置状态 { //更新标题 UpdateServerTitle(ServiceStatus); //设置按钮 GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(TRUE); GetDlgItem(IDC_START_SERVICE)->EnableWindow(FALSE); //配置按钮 GetDlgItem(IDC_OPEN_MATCH)->EnableWindow(FALSE); GetDlgItem(IDC_OPEN_SERVER)->EnableWindow(FALSE); GetDlgItem(IDC_CREATE_SERVER)->EnableWindow(FALSE); GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(FALSE); GetDlgItem(IDC_OPTION_MATCH)->EnableWindow(FALSE); //运行按钮 GetDlgItem(IDC_RUN_PARAMETER)->EnableWindow(FALSE); GetDlgItem(IDC_SERVICE_CONTROL)->EnableWindow(FALSE); //提示信息 LPCTSTR pszDescribe = TEXT("正在初始化组件..."); CTraceService::TraceString(pszDescribe, TraceLevel_Normal); break; } case ServiceStatus_Service: //服务状态 { //更新标题 //UpdateServerTitle(ServiceStatus); TCHAR buf[100] = {0}; GetCurrentDirectory(sizeof(buf), buf); HINSTANCE hInst = NULL; hInst = AfxGetApp()->m_hInstance; TCHAR path_buffer[_MAX_PATH] = {0}; GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径 CString csTest = L""; //csTest.Format(TEXT("游戏服务器V1.2 -- [ 运行 ] -- [服务器编号:%d]-- [ 启动路径:%s ]"), m_ServiceUnits.GetGameServiceOption()->wServerID, path_buffer); csTest.Format(TEXT("[ %s ] -- [ 运行 ] -- [服务器编号:%d]-- [ 启动路径:%s ]"), m_ServiceUnits.GetGameServiceOption()->szServerName, m_ServiceUnits.GetGameServiceOption()->wServerID, path_buffer); SetWindowText(csTest); //服务按钮 GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(TRUE); GetDlgItem(IDC_START_SERVICE)->EnableWindow(FALSE); //配置按钮 GetDlgItem(IDC_OPEN_MATCH)->EnableWindow(FALSE); GetDlgItem(IDC_OPEN_SERVER)->EnableWindow(FALSE); GetDlgItem(IDC_CREATE_SERVER)->EnableWindow(FALSE); GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(FALSE); //运行按钮 GetDlgItem(IDC_RUN_PARAMETER)->EnableWindow(TRUE); GetDlgItem(IDC_SERVICE_CONTROL)->EnableWindow(TRUE); //提示信息 LPCTSTR pszDescribe = TEXT("服务启动成功"); CTraceService::TraceString(pszDescribe, TraceLevel_Normal); break; } } return; } VOID CGameServerDlg::UpdateServerLogo(LPCTSTR pszServerDLL) { //加载资源 HINSTANCE hInstance = AfxLoadLibrary(pszServerDLL); //加载图形 if (hInstance != NULL) { //设置资源 AfxSetResourceHandle(hInstance); //设置资源 CStatic * pServerLogo = (CStatic *)GetDlgItem(IDC_SERVER_LOGO); pServerLogo->SetIcon(::LoadIcon(hInstance, TEXT("SERVER_ICON"))); //释放资源 AfxFreeLibrary(hInstance); AfxSetResourceHandle(GetModuleHandle(NULL)); } return; } VOID CGameServerDlg::UpdateServerTitle(enServiceStatus ServiceStatus) { //变量定义 LPCTSTR pszStatusName = NULL; LPCTSTR pszServerName = NULL; //状态字符 switch (ServiceStatus) { case ServiceStatus_Stop: //停止状态 { pszStatusName = TEXT("停止"); break; } case ServiceStatus_Config: //配置状态 { pszStatusName = TEXT("初始化"); break; } case ServiceStatus_Service: //运行状态 { pszStatusName = TEXT("运行"); break; } } //房间名字 if (m_bOptionSuccess == false) pszServerName = TEXT("游戏服务器"); else pszServerName = m_ModuleInitParameter.GameServiceOption.szServerName; //构造标题 TCHAR szTitle[128] = TEXT(""); _sntprintf(szTitle, CountArray(szTitle), TEXT("[ %s ] -- [ %s ]"), pszServerName, pszStatusName); //设置标题 SetWindowText(szTitle); return; } VOID CGameServerDlg::UpdateParameterStatus(tagModuleInitParameter & ModuleInitParameter) { //设置变量 m_bOptionSuccess = true; m_ModuleInitParameter = ModuleInitParameter; //更新标题 UpdateServerTitle(ServiceStatus_Stop); UpdateServerLogo(ModuleInitParameter.GameServiceAttrib.szServerDLLName); //设置按钮 GetDlgItem(IDC_START_SERVICE)->EnableWindow(TRUE); GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(TRUE); //不是比赛就过滤 if ((ModuleInitParameter.GameServiceOption.wServerType&GAME_GENRE_MATCH) != 0) { GetDlgItem(IDC_OPTION_MATCH)->EnableWindow(TRUE); } else { GetDlgItem(IDC_OPTION_MATCH)->EnableWindow(FALSE); } //设置控件 SetDlgItemText(IDC_GAME_NAME, m_ModuleInitParameter.GameServiceAttrib.szGameName); SetDlgItemText(IDC_SERVER_NAME, m_ModuleInitParameter.GameServiceOption.szServerName); //监听端口 if (m_ModuleInitParameter.GameServiceOption.wServerPort == 0) { SetDlgItemText(IDC_SERVER_PORT, TEXT("自动适配")); } else { SetDlgItemInt(IDC_SERVER_PORT, m_ModuleInitParameter.GameServiceOption.wServerPort); } //设置模块 LPCTSTR pszServerDLLName = m_ModuleInitParameter.GameServiceAttrib.szServerDLLName; m_ServiceUnits.CollocateService(pszServerDLLName, m_ModuleInitParameter.GameServiceOption, m_ModuleInitParameter.vecVenueInfo); //构造提示 TCHAR szString[256] = TEXT(""); LPCTSTR pszServerName = m_ModuleInitParameter.GameServiceOption.szServerName; _sntprintf(szString, CountArray(szString), TEXT("[ %s ] 房间参数加载成功"), pszServerName); //输出信息 CTraceService::TraceString(szString, TraceLevel_Normal); return; } bool CGameServerDlg::StartServerService(WORD wServerID) { //变量定义 tagDataBaseParameter DataBaseParameter; ZeroMemory(&DataBaseParameter, sizeof(DataBaseParameter)); //设置参数 InitDataBaseParameter(DataBaseParameter); m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter); //读取配置 CDlgServerItem DlgServerItem; if (DlgServerItem.OpenGameServer(wServerID) == false) { CTraceService::TraceString(TEXT("房间配置参数不存在或者加载失败"), TraceLevel_Exception); return false; } //更新状态 UpdateParameterStatus(DlgServerItem.m_ModuleInitParameter); //启动服务 try { m_ServiceUnits.StartService(); } catch (...) { ASSERT(FALSE); } return true; } bool CGameServerDlg::InitDataBaseParameter(tagDataBaseParameter & DataBaseParameter) { //获取路径 TCHAR szWorkDir[MAX_PATH] = TEXT(""); CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir)); //构造路径 TCHAR szIniFile[MAX_PATH] = TEXT(""); _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\ServerParameter.ini"), szWorkDir); //读取配置 CWHIniData IniData; IniData.SetIniFilePath(szIniFile); //连接信息 DataBaseParameter.wDataBasePort = (WORD)IniData.ReadInt(TEXT("PlatformDB"), TEXT("DBPort"), 1433); IniData.ReadEncryptString(TEXT("PlatformDB"), TEXT("DBAddr"), NULL, DataBaseParameter.szDataBaseAddr, CountArray(DataBaseParameter.szDataBaseAddr)); IniData.ReadEncryptString(TEXT("PlatformDB"), TEXT("DBUser"), NULL, DataBaseParameter.szDataBaseUser, CountArray(DataBaseParameter.szDataBaseUser)); IniData.ReadEncryptString(TEXT("PlatformDB"), TEXT("DBPass"), NULL, DataBaseParameter.szDataBasePass, CountArray(DataBaseParameter.szDataBasePass)); IniData.ReadEncryptString(TEXT("PlatformDB"), TEXT("DBName"), szPlatformDB, DataBaseParameter.szDataBaseName, CountArray(DataBaseParameter.szDataBaseName)); CString m_HttpPath; //读取字符 DWORD dwReadCount = GetPrivateProfileString(TEXT("HTTP"), TEXT("PATH"), NULL, CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath, 512, szIniFile); //读取字符 DWORD dwReadCount2 = GetPrivateProfileString(TEXT("HTTP2"), TEXT("PATH2"), NULL, CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath2, 512, szIniFile); //读取字符 DWORD dwReadCount3 = GetPrivateProfileString(TEXT("HTTP3"), TEXT("PATH3"), NULL, CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath3, 512, szIniFile); DWORD dwReadCount4 = GetPrivateProfileString(TEXT("HTTP4"), TEXT("PATH4"), NULL, CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath4, 512, szIniFile); ///+++客户端最低要求版本号 GetPrivateProfileString(TEXT("ClientVer"), TEXT("version"), L"1.0.0", CServiceUnits::g_pServiceUnits->m_InitParameter.m_szMinClientVer, 32, szIniFile); return true; } void CGameServerDlg::OnBnClickedStartService() { //启动服务 try { int iRet = 0; CString csText; iRet = mListBox.GetCurSel(); iRet++; csText.Format(L"%d", iRet); //获取路径 TCHAR szWorkDir[MAX_PATH] = TEXT(""); CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir)); //构造路径 TCHAR szIniFile[MAX_PATH] = TEXT(""); _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\Parameter.ini"), szWorkDir); //保存 BOOL bRet = WritePrivateProfileString(TEXT("Server"), TEXT("Level"), csText, szIniFile); m_ServiceUnits.m_InitParameter.m_ServiceLevel = iRet; m_StartTime = CTime::GetCurrentTime(); SetTimer(1, 30000, NULL); //启用共享内存 HANDLE m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _T("GAMESERVERINFOG__")); if (m_hMapFile) { //显示共享的文件数据。 LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); HINSTANCE hInst = NULL; hInst = AfxGetApp()->m_hInstance; TCHAR path_buffer[_MAX_PATH] = { 0 }; GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径 GAMESERVERINFOALL *pBuffer = (GAMESERVERINFOALL *)lpMapAddr; //检测当前节点是否存在 if (pBuffer->iNum > 20) { CTraceService::TraceString(TEXT("共享内存数据数据混乱"), TraceLevel_Warning); goto look; } //查找节点是否已经存在 for (int i = 0; i < pBuffer->iNum; i++) { if (pBuffer->Data[i].dServerID == g_StartP.wServerID) { StringCchCopy(pBuffer->Data[i].szPath, 256, path_buffer); pBuffer->Data[i].iStat = 1; pBuffer->Data[i].Pid = GetCurrentProcessId(); FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1); goto look; } } (pBuffer->iNum)++; pBuffer->Data[pBuffer->iNum - 1].dServerID = g_StartP.wServerID; StringCchCopy(pBuffer->Data[pBuffer->iNum - 1].szPath, 256, path_buffer); pBuffer->Data[pBuffer->iNum - 1].iStat = 1; pBuffer->Data[pBuffer->iNum - 1].Pid = GetCurrentProcessId(); FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1); } else { //创建共享文件。 m_hMapFile = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 0x10000, _T("GAMESERVERINFOG__")); //拷贝数据到共享文件里。 LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); HINSTANCE hInst = NULL; hInst = AfxGetApp()->m_hInstance; TCHAR path_buffer[_MAX_PATH] = { 0 }; GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径 GAMESERVERINFOALL Buffer; ZeroMemory(&Buffer, sizeof(GAMESERVERINFOALL)); Buffer.iNum++; Buffer.Data[Buffer.iNum - 1].dServerID = g_StartP.wServerID; StringCchCopy(Buffer.Data[Buffer.iNum - 1].szPath, 256, path_buffer); Buffer.Data[Buffer.iNum - 1].iStat = 1; Buffer.Data[Buffer.iNum - 1].Pid = GetCurrentProcessId(); StringCchCopy(Buffer.szCtrl, 256, g_StartP.szCeLv); memcpy(lpMapAddr, &Buffer, sizeof(GAMESERVERINFOALL)); FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1); } look: m_ServiceUnits.StartService(); } catch (...) { ASSERT(FALSE); } return; } void CGameServerDlg::OnBnClickedStopService() { int iRet = MessageBox(L"确定关闭吗?", L"真的确定关闭我吗", MB_YESNO); if (IDYES != iRet) { return; } //停止服务 try { StopService(); } catch (...) { ASSERT(FALSE); } return; } void CGameServerDlg::OnBnClickedOpenServer() { //变量定义 tagDataBaseParameter DataBaseParameter; ZeroMemory(&DataBaseParameter, sizeof(DataBaseParameter)); //设置参数 InitDataBaseParameter(DataBaseParameter); m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter); //配置房间 CDlgServerItem DlgServerItem; DlgServerItem.g_StartP = g_StartP; //启动参数 if (DlgServerItem.OpenGameServer() == false) return; //更新状态 UpdateParameterStatus(DlgServerItem.m_ModuleInitParameter); return; } void CGameServerDlg::OnBnClickedOpenMatch() { // TODO: 在此添加控件通知处理程序代码 } void CGameServerDlg::OnBnClickedCreateServer() { //变量定义 tagDataBaseParameter DataBaseParameter; ZeroMemory(&DataBaseParameter, sizeof(DataBaseParameter)); //设置参数 InitDataBaseParameter(DataBaseParameter); m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter); //创建房间 CDlgServerWizard DlgServerWizard; if (DlgServerWizard.CreateGameServer() == false) return; //更新状态 UpdateParameterStatus(DlgServerWizard.m_ModuleInitParameter); return; } void CGameServerDlg::OnBnClickedOptionServer() { //游戏模块 CGameServiceManagerHelper GameServiceManager; GameServiceManager.SetModuleCreateInfo(m_ModuleInitParameter.GameServiceAttrib.szServerDLLName, GAME_SERVICE_CREATE_NAME); //加载模块 if (GameServiceManager.CreateInstance() == false) { AfxMessageBox(TEXT("服务组件不存在或者加载失败,配置房间失败"), MB_ICONERROR); return; } //配置房间 CDlgServerWizard DlgServerWizard; DlgServerWizard.SetWizardParameter(GameServiceManager.GetInterface(), &m_ModuleInitParameter.GameServiceOption); //创建房间 if (DlgServerWizard.CreateGameServer() == false) return; //更新状态 UpdateParameterStatus(DlgServerWizard.m_ModuleInitParameter); return; } void CGameServerDlg::OnBnClickedOptionMatch() { //不是比赛就过滤 if ((m_ModuleInitParameter.GameServiceOption.wServerType&GAME_GENRE_MATCH) == 0) return; //变量定义 tagDataBaseParameter DataBaseParameter; ZeroMemory(&DataBaseParameter, sizeof(DataBaseParameter)); //设置参数 InitDataBaseParameter(DataBaseParameter); m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter); //配置房间 CDlgServerMatch DlgServerMatch; if (DlgServerMatch.OpenGameMatch(m_ModuleInitParameter.GameServiceAttrib.wKindID) == false) return; //拷贝数据 CopyMemory(&m_ModuleInitParameter.GameMatchOption, &DlgServerMatch.m_GameMatchOption, sizeof(m_ModuleInitParameter.GameMatchOption)); //配置游戏 m_ServiceUnits.CollocateService(m_ModuleInitParameter.GameMatchOption, m_ModuleInitParameter.vecVenueInfo); //输出信息 CTraceService::TraceString(TEXT("比赛配置加载成功"), TraceLevel_Normal); } //加载配置 VOID CGameServerDlg::LoadInitParameter() { //获取路径 TCHAR szWorkDir[MAX_PATH] = TEXT(""); CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir)); //构造路径 TCHAR szIniFile[MAX_PATH] = TEXT(""); _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\Parameter.ini"), szWorkDir); //读取配置 CWHIniData IniData; IniData.SetIniFilePath(szIniFile); g_StartP.iLevel = IniData.ReadInt(TEXT("Server"), TEXT("Level"), 1); g_StartP.iAuto = IniData.ReadInt(TEXT("Server"), TEXT("Auto"), 0); g_StartP.wServerID = IniData.ReadInt(TEXT("Server"), TEXT("ServerID"), 0); CGameServerDlg::g_bGameLog = IniData.ReadInt(TEXT("Gamelog"), TEXT("ServerID"), 1); IniData.ReadString(TEXT("SYS"), TEXT("守护进程"), TEXT(""), g_StartP.szShouHu, CountArray(g_StartP.szShouHu)); IniData.ReadString(TEXT("SYS"), TEXT("策略获取地址"), TEXT(""), g_StartP.szCeLv, CountArray(g_StartP.szCeLv)); switch (g_StartP.iLevel) { case 1: mListBox.SetCurSel(0); break; case 2: mListBox.SetCurSel(1); break; case 3: mListBox.SetCurSel(2); break; case 4: mListBox.SetCurSel(3); break; case 5: mListBox.SetCurSel(4); break; case 6: mListBox.SetCurSel(5); break; case 7: mListBox.SetCurSel(6); break; case 8: mListBox.SetCurSel(7); break; default: break; } ((CButton*)GetDlgItem(IDC_CHECK6))->SetCheck(g_StartP.iAuto); if (g_StartP.iAuto == 1) SetTimer(2, 3000, NULL); //自动化调用 return; } void CGameServerDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (nIDEvent == 1) { CTime End = CTime::GetCurrentTime(); CTimeSpan csTest = End - m_StartTime; CString csTime = m_StartTime.Format(_T("%Y-%m-%d %H:%M:%S")); CString csTime1 = End.Format(_T("%Y-%m-%d %H:%M:%S")); int a, b, c,d; a = csTest.GetHours(); b = csTest.GetMinutes(); c = csTest.GetSeconds(); d = csTest.GetTotalHours() / 24; CString cs; cs.Format(L"%ld天 %2ld:%2ld:%2ld", d, a, b, c); i1.SetWindowText(cs); } else if (nIDEvent == 2) { KillTimer(nIDEvent); CGameServerDlg::OnBnClickedOpenServer(); if (g_StartP.iAuto == 1 && g_StartP.iErr == 0) { OnBnClickedStartService(); } else { if (g_StartP.iAuto == 1 && g_StartP.iErr == -2) { CTraceService::TraceString(TEXT("未找指定节点的服务器信息"), TraceLevel_Warning); } } } else if (nIDEvent == 100) { if (m_Data.iPlayingTableCount == 0) { KillTimer(nIDEvent); //检测人数是否已经退出,若都退出则关闭。 DWORD dwProcessID = NULL; if (!StatisticalUser::GetTokenByName(dwProcessID, g_StartP.szShouHu)) { CTraceService::TraceString(TEXT("未找守护进程,无法回报信息。"), TraceLevel_Warning); return; } CList mList; if (!StatisticalUser::GetWindowHwndByPid(dwProcessID, mList)) { CTraceService::TraceString(TEXT("未找守护进程对应的窗口,无法回报信息。"), TraceLevel_Warning); return; } StopService(); Sleep(100); CString csTest; csTest.Format(L"守护进程包含 %d 个窗口,任务ID:%d,实例ID:%d", mList.GetCount(), iRenWuID, g_StartP.wServerID); CTraceService::TraceString(csTest, TraceLevel_Normal); //发送信息 POSITION pos = mList.GetTailPosition(); CString data; while (pos != NULL) { HWND hHandle = mList.GetNext(pos); DWORD dRet = ::SendMessage(hHandle, WM_MYMSGACK, iRenWuID, g_StartP.wServerID); DWORD dLastID = GetLastError(); CString csTest; csTest.Format(L"发送消息返回:%d,LastID:%d", dRet, dLastID); CTraceService::TraceString(csTest, TraceLevel_Normal); } } } else if (nIDEvent == 101) { KillTimer(nIDEvent); //30分钟后,强制关闭 DWORD dwProcessID = NULL; if (!StatisticalUser::GetTokenByName(dwProcessID, g_StartP.szShouHu)) { CTraceService::TraceString(TEXT("未找守护进程,无法回报信息。"), TraceLevel_Warning); return; } CList mList; if (!StatisticalUser::GetWindowHwndByPid(dwProcessID, mList)) { CTraceService::TraceString(TEXT("未找守护进程对应的窗口,无法回报信息。"), TraceLevel_Warning); return; } StopService(); Sleep(100); CString csTest; csTest.Format(L"守护进程包含 %d 个窗口,任务ID:%d,实例ID:%d", mList.GetCount(), iRenWuID, g_StartP.wServerID); CTraceService::TraceString(csTest, TraceLevel_Normal); //发送信息 POSITION pos = mList.GetTailPosition(); CString data; while (pos != NULL) { HWND hHandle = mList.GetNext(pos); ::SendMessage(hHandle, WM_MYMSGACK, iRenWuID, g_StartP.wServerID); } } __super::OnTimer(nIDEvent); } //发布全服公告 void CGameServerDlg::OnSendGongGaoButton1() { // TODO: 在此添加控件通知处理程序代码 CMD_GR_SendMessage SysMessage; ZeroMemory(&SysMessage, sizeof(SysMessage)); CString csTest; j4.GetWindowText(csTest); if (csTest.GetLength() == 0 || csTest.GetLength() > 128) { MessageBox(L"发布信息长度不能为空,或大于128个字节。"); return; } // TODO: 在此添加控件通知处理程序代码 DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck(); if (BST_UNCHECKED == dwState) { SysMessage.cbLoop = FALSE; } else { SysMessage.cbLoop = TRUE; } dwState = ((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck(); if (BST_UNCHECKED == dwState) { SysMessage.cbAllRoom = TRUE; } else { SysMessage.cbAllRoom = FALSE; } SysMessage.cbGame = TRUE; SysMessage.cbRoom = TRUE; //读取时间 SYSTEMTIME systime; ZeroMemory(&systime, sizeof(systime)); int iHouMiao = 15; int iHouXunHuan = j3.GetCurSel(); switch (iHouXunHuan) { case 0: iHouMiao = 15; break; case 1: iHouMiao = 30; break; case 2: iHouMiao = 45; break; case 3: iHouMiao = 60; break; case 4: iHouMiao = 120; break; case 5: iHouMiao = 3600; break; case 6: iHouMiao = 3600 * 24; break; default: break; } int iMiao = 5; int iXunHuan = j2.GetCurSel(); switch (iXunHuan) { case 0: iMiao = 5; break; case 1: iMiao = 10; break; case 2: iMiao = 15; break; case 3: iMiao = 20; break; case 4: iMiao = 30; break; case 5: iMiao = 60; break; case 6: iMiao = 3600; break; default: break; } int iEndXunHuan = j3.GetCurSel(); CTime ConcludeTime(systime); SysMessage.tConcludeTime = ConcludeTime.GetTime() + 1000 * iHouMiao; SysMessage.dwTimeRate = 1000 * iMiao; StringCchCat(SysMessage.szSystemMessage, _countof(SysMessage.szSystemMessage), csTest/*.GetBuffer()*/); SysMessage.wChatLength = (_countof(SysMessage.szSystemMessage)); (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_GG, 0, &SysMessage, sizeof(SysMessage)); } void CGameServerDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_STOP_GG, NULL, 0, 0); } void CGameServerDlg::OnBnHotItemChangeCheck2(NMHDR *pNMHDR, LRESULT *pResult) { // 此功能要求 Internet Explorer 6 或更高版本。 // 符号 _WIN32_IE 必须是 >= 0x0600。 LPNMBCHOTITEM pHotItem = reinterpret_cast(pNMHDR); // TODO: 在此添加控件通知处理程序代码 *pResult = 0; } void CGameServerDlg::OnBnClickedCheck2() { // TODO: 在此添加控件通知处理程序代码 DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK2))->GetCheck(); if (BST_UNCHECKED == dwState) { int iRet = 0; (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_CJ, 0, &iRet, sizeof(int)); } else { int iRet = 1; (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_CJ, 0, &iRet, sizeof(int)); } } void CGameServerDlg::OnBnClickedCheck3() { // TODO: 在此添加控件通知处理程序代码 DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK3))->GetCheck(); if (BST_UNCHECKED == dwState) { int iRet = 0; (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JR, 0, &iRet, sizeof(int)); } else { int iRet = 1; (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JR, 0, &iRet, sizeof(int)); } } //强制解散空闲房间 void CGameServerDlg::OnBnClickedButton7() { // TODO: 在此添加控件通知处理程序代码 (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JSFREEALL, 0, NULL, 0); } void CGameServerDlg::OnBnClickedButton4() { // TODO: 在此添加控件通知处理程序代码 (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JSGAMEALL, 0, NULL, 0); } void CGameServerDlg::OnBnClickedCheck4() { // TODO: 在此添加控件通知处理程序代码 DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK4))->GetCheck(); if (BST_UNCHECKED == dwState) { int iRet = 0; (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_WORK, 0, &iRet, sizeof(int)); } else { int iRet = 1; (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_WORK, 0, &iRet, sizeof(int)); } } void CGameServerDlg::OnBnClickedCheck7() { // TODO: 在此添加控件通知处理程序代码 DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK7))->GetCheck(); if (BST_UNCHECKED == dwState) { int iRet = 0; (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_HUA_CREATE, 0, &iRet, sizeof(int)); } else { int iRet = 1; (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_HUA_CREATE, 0, &iRet, sizeof(int)); } } void CGameServerDlg::OnBnClickedButton5() { // TODO: 在此添加控件通知处理程序代码 CString csRoomID; j5.GetWindowText(csRoomID); int iRet = _wtol(csRoomID/*.GetBuffer()*/); if (iRet> 999999 || iRet < 100000) { MessageBox(L"输入房间号不正确"); return; } (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JSROOM,0, &iRet, sizeof(int)); } void CGameServerDlg::OnBnClickedButton6() { // TODO: 在此添加控件通知处理程序代码 CString csUserID; j6.GetWindowText(csUserID); int iRet = _wtol(csUserID/*.GetBuffer()*/); if (iRet> 999999 || iRet < 100000) { MessageBox(L"输入UID不正确"); return; } //csUserID.ReleaseBuffer(); (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_SHUTDOWN_USER,0, &iRet, sizeof(int)); } void CGameServerDlg::OnBnClickedButton3() { // TODO: 在此添加控件通知处理程序代码 CString csTest; j7.GetWindowText(csTest); int iRet = _wtol(csTest/*.GetBuffer()*/); if (iRet<0) { MessageBox(L"输入UID不正确"); return; } //csTest.ReleaseBuffer(); int iNum = bbb.GetCount(); if (iNum >20) { MessageBox(L"最多只能监测20个用户"); return; } bbb.InsertString(iNum, csTest); } void CGameServerDlg::OnBnClickedButton8() { // TODO: 在此添加控件通知处理程序代码 bbb.ResetContent(); } void CGameServerDlg::OnBnClickedCheck5() { // TODO: 在此添加控件通知处理程序代码 DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK5))->GetCheck(); DWORD dUserID[20]; ZeroMemory(dUserID, sizeof(DWORD) * 20); if (BST_UNCHECKED == dwState) { (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JC, 0, NULL, 0); } else { if (bbb.GetCount() == 0) { ((CButton*)GetDlgItem(IDC_CHECK5))->SetCheck(false); MessageBox(L"请添加监测ID"); return; } for (int i = 0; i < bbb.GetCount(); i++) { CString csTest; bbb.GetText(i, csTest); int iRet = _wtol(csTest); dUserID[i] = iRet; } (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_JC, 0, dUserID, sizeof(DWORD) * 20); } } void CGameServerDlg::OnLbnSelchangeList2() { // TODO: 在此添加控件通知处理程序代码 int nIndex = ccc.GetCurSel(); if (nIndex != LB_ERR) { CString csTest = L"0"; ccc.GetText(nIndex, csTest); int d = _wtol(csTest); (m_ServiceUnits.m_AttemperEngineSink.GetTCPNetworkEngine())->OnTBDataEvent(DBO_GR_GAME_FIND, 0, &d, sizeof(int)); } } void CGameServerDlg::OnBnClickedCheck6() { // TODO: 在此添加控件通知处理程序代码 DWORD dwState = ((CButton*)GetDlgItem(IDC_CHECK6))->GetCheck(); if (BST_UNCHECKED == dwState) { g_StartP.iAuto = 0; TCHAR szWorkDir[MAX_PATH] = TEXT(""); CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir)); //构造路径 TCHAR szIniFile[MAX_PATH] = TEXT(""); _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\Parameter.ini"), szWorkDir); //保存 BOOL bRet = WritePrivateProfileString(TEXT("Server"), TEXT("Auto"), L"0", szIniFile); } else { g_StartP.iAuto = 1; TCHAR szWorkDir[MAX_PATH] = TEXT(""); CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir)); //构造路径 TCHAR szIniFile[MAX_PATH] = TEXT(""); _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\Parameter.ini"), szWorkDir); //保存 BOOL bRet = WritePrivateProfileString(TEXT("Server"), TEXT("Auto"), L"1", szIniFile); } } int CGameServerDlg::StopService() { KillTimer(1); m_ServiceUnits.ConcludeService(); //启用共享内存 HANDLE m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _T("GAMESERVERINFOG__")); if (m_hMapFile) { //显示共享的文件数据。 LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); HINSTANCE hInst = NULL; hInst = AfxGetApp()->m_hInstance; TCHAR path_buffer[_MAX_PATH] = { 0 }; GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径 GAMESERVERINFOALL *pBuffer = (GAMESERVERINFOALL *)lpMapAddr; //检测当前节点是否存在 if (pBuffer->iNum > 20) { return -1; } //查找节点是否已经存在 for (int i = 0; i < pBuffer->iNum; i++) { if (pBuffer->Data[i].dServerID == g_StartP.wServerID) { StringCchCopy(pBuffer->Data[i].szPath, 256, path_buffer); pBuffer->Data[i].iStat = -1; pBuffer->Data[i].Pid = 0; FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1); } } } return 0; } void CGameServerDlg::OnBnClickedButton9() { // TODO: 在此添加控件通知处理程序代码 HANDLE m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _T("GAMESERVERINFOG__")); if (m_hMapFile) { //显示共享的文件数据。 LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); HINSTANCE hInst = NULL; hInst = AfxGetApp()->m_hInstance; TCHAR path_buffer[_MAX_PATH] = { 0 }; GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径 GAMESERVERINFOALL *pBuffer = (GAMESERVERINFOALL *)lpMapAddr; ZeroMemory(pBuffer, sizeof(GAMESERVERINFOALL)); FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1); } }