UpdateClientDlg.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:9k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // UpdateClientDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include <objbase.h>
  5. #include <initguid.h>
  6. #include "UpdateClient.h"
  7. #include "UpdateClientDlg.h"
  8. #include "Library.h"
  9. #include "Macro.h"
  10. #include "Buffer.h"
  11. #include "..\UpdateServer\protocol.h"
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. OnlineGameLib::Win32::CLibrary g_theRainbowLib( "rainbow.dll" );
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CAboutDlg dialog used for App About
  20. class CAboutDlg : public CDialog
  21. {
  22. public:
  23. CAboutDlg();
  24. // Dialog Data
  25. //{{AFX_DATA(CAboutDlg)
  26. enum { IDD = IDD_ABOUTBOX };
  27. //}}AFX_DATA
  28. // ClassWizard generated virtual function overrides
  29. //{{AFX_VIRTUAL(CAboutDlg)
  30. protected:
  31. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  32. //}}AFX_VIRTUAL
  33. // Implementation
  34. protected:
  35. //{{AFX_MSG(CAboutDlg)
  36. //}}AFX_MSG
  37. DECLARE_MESSAGE_MAP()
  38. };
  39. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  40. {
  41. //{{AFX_DATA_INIT(CAboutDlg)
  42. //}}AFX_DATA_INIT
  43. }
  44. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  45. {
  46. CDialog::DoDataExchange(pDX);
  47. //{{AFX_DATA_MAP(CAboutDlg)
  48. //}}AFX_DATA_MAP
  49. }
  50. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  51. //{{AFX_MSG_MAP(CAboutDlg)
  52. // No message handlers
  53. //}}AFX_MSG_MAP
  54. END_MESSAGE_MAP()
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CUpdateClientDlg dialog
  57. CUpdateClientDlg::CUpdateClientDlg(CWnd* pParent /*=NULL*/)
  58. : CDialog(CUpdateClientDlg::IDD, pParent)
  59. {
  60. //{{AFX_DATA_INIT(CUpdateClientDlg)
  61. m_nServerPort = 7653;
  62. m_csExePath = _T("");
  63. //}}AFX_DATA_INIT
  64. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  65. m_pClient = NULL;
  66. }
  67. void CUpdateClientDlg::DoDataExchange(CDataExchange* pDX)
  68. {
  69. CDialog::DoDataExchange(pDX);
  70. //{{AFX_DATA_MAP(CUpdateClientDlg)
  71. DDX_Control(pDX, IDC_LIST_TASK, m_ctlTaskList);
  72. DDX_Control(pDX, IDC_IPADDRESS_SERVER, m_ctlServerIP);
  73. DDX_Text(pDX, IDC_EDIT_SERVER_PORT, m_nServerPort);
  74. DDX_Text(pDX, IDC_EDIT_EXE_PATH, m_csExePath);
  75. //}}AFX_DATA_MAP
  76. }
  77. BEGIN_MESSAGE_MAP(CUpdateClientDlg, CDialog)
  78. //{{AFX_MSG_MAP(CUpdateClientDlg)
  79. ON_WM_SYSCOMMAND()
  80. ON_WM_PAINT()
  81. ON_WM_QUERYDRAGICON()
  82. ON_BN_CLICKED(IDC_BTN_REMOVE, OnBtnRemove)
  83. ON_BN_CLICKED(IDC_BTN_FIND, OnBtnFind)
  84. ON_BN_CLICKED(IDC_BTN_INSERT, OnBtnInsert)
  85. ON_WM_TIMER()
  86. //}}AFX_MSG_MAP
  87. END_MESSAGE_MAP()
  88. /////////////////////////////////////////////////////////////////////////////
  89. // CUpdateClientDlg message handlers
  90. BOOL CUpdateClientDlg::OnInitDialog()
  91. {
  92. CDialog::OnInitDialog();
  93. // Add "About..." menu item to system menu.
  94. // IDM_ABOUTBOX must be in the system command range.
  95. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  96. ASSERT(IDM_ABOUTBOX < 0xF000);
  97. CMenu* pSysMenu = GetSystemMenu(FALSE);
  98. if (pSysMenu != NULL)
  99. {
  100. CString strAboutMenu;
  101. strAboutMenu.LoadString(IDS_ABOUTBOX);
  102. if (!strAboutMenu.IsEmpty())
  103. {
  104. pSysMenu->AppendMenu(MF_SEPARATOR);
  105. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  106. }
  107. }
  108. SetIcon(m_hIcon, TRUE); // Set big icon
  109. SetIcon(m_hIcon, FALSE); // Set small icon
  110. m_ctlServerIP.SetAddress( 0x7F, 0, 0, 1 );
  111. ::SetTimer( *this, 1000, 50, NULL );
  112. return TRUE;  // return TRUE  unless you set the focus to a control
  113. }
  114. void CUpdateClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
  115. {
  116. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  117. {
  118. CAboutDlg dlgAbout;
  119. dlgAbout.DoModal();
  120. }
  121. else
  122. {
  123. CDialog::OnSysCommand(nID, lParam);
  124. }
  125. }
  126. // If you add a minimize button to your dialog, you will need the code below
  127. //  to draw the icon.  For MFC applications using the document/view model,
  128. //  this is automatically done for you by the framework.
  129. void CUpdateClientDlg::OnPaint() 
  130. {
  131. if (IsIconic())
  132. {
  133. CPaintDC dc(this); // device context for painting
  134. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  135. // Center icon in client rectangle
  136. int cxIcon = GetSystemMetrics(SM_CXICON);
  137. int cyIcon = GetSystemMetrics(SM_CYICON);
  138. CRect rect;
  139. GetClientRect(&rect);
  140. int x = (rect.Width() - cxIcon + 1) / 2;
  141. int y = (rect.Height() - cyIcon + 1) / 2;
  142. // Draw the icon
  143. dc.DrawIcon(x, y, m_hIcon);
  144. }
  145. else
  146. {
  147. CDialog::OnPaint();
  148. }
  149. }
  150. HCURSOR CUpdateClientDlg::OnQueryDragIcon()
  151. {
  152. return (HCURSOR) m_hIcon;
  153. }
  154. void CUpdateClientDlg::OnOK() 
  155. {
  156. UpdateData( TRUE );
  157. BYTE cIP[4];
  158. m_ctlServerIP.GetAddress( cIP[0], cIP[1], cIP[2], cIP[3] );
  159. if ( !m_nServerPort )
  160. {
  161. AfxMessageBox( "Please input a valid IPAddress and port" );
  162. return;
  163. }
  164. CString csIP;
  165. csIP.Format( "%d.%d.%d.%d", cIP[0], cIP[1], cIP[2], cIP[3] );
  166. /*
  167.  * For the db-role server
  168.  */
  169. pfnCreateClientInterface pClientFactroyFun = ( pfnCreateClientInterface )( g_theRainbowLib.GetProcAddress( _T( "CreateInterface" ) ) );
  170. IClientFactory *pClientFactory = NULL;
  171. if ( pClientFactroyFun && SUCCEEDED( pClientFactroyFun( IID_IClientFactory, reinterpret_cast< void ** >( &pClientFactory ) ) ) )
  172. {
  173. pClientFactory->SetEnvironment( 1024 );
  174. pClientFactory->CreateClientInterface( IID_IESClient, reinterpret_cast< void ** >( &m_pClient ) );
  175. SAFE_RELEASE( pClientFactory );
  176. }
  177. if ( m_pClient )
  178. {
  179. m_pClient->Startup();
  180. m_pClient->RegisterMsgFilter( reinterpret_cast< void * >( this ), EventNotify );
  181. if ( SUCCEEDED( m_pClient->ConnectTo( csIP, m_nServerPort ) ) )
  182. {
  183. ::EnableWindow( GetDlgItem( IDOK )->GetSafeHwnd(), FALSE );
  184. ::EnableWindow( GetDlgItem( IDC_IPADDRESS_SERVER )->GetSafeHwnd(), FALSE );
  185. ::EnableWindow( GetDlgItem( IDC_EDIT_SERVER_PORT )->GetSafeHwnd(), FALSE );
  186. }
  187. }
  188. }
  189. void CUpdateClientDlg::OnBtnInsert() 
  190. {
  191. if ( !m_csExePath.IsEmpty() )
  192. {
  193. m_ctlTaskList.AddString( m_csExePath );
  194. }
  195. }
  196. void CUpdateClientDlg::OnBtnRemove() 
  197. {
  198. m_ctlTaskList.GetCurSel();
  199. int nIndex = m_ctlTaskList.GetCurSel();
  200. int nCount = m_ctlTaskList.GetCount();
  201. if ( ( nIndex != LB_ERR ) && ( nCount > 0 ))
  202. {
  203. m_ctlTaskList.DeleteString( nIndex );
  204. }
  205. }
  206. void CUpdateClientDlg::OnCancel() 
  207. {
  208. ::KillTimer( *this, 1000 );
  209. CDialog::OnCancel();
  210. }
  211. void CUpdateClientDlg::OnBtnFind() 
  212. {
  213. OPENFILENAME ofn;       // common dialog box structure
  214. char szFile[260];       // buffer for file name
  215. szFile[0] = '';
  216. // Initialize OPENFILENAME
  217. ZeroMemory( &ofn, sizeof( OPENFILENAME ) );
  218. ofn.lStructSize = sizeof( OPENFILENAME );
  219. ofn.hwndOwner = *this;
  220. ofn.lpstrFile = szFile;
  221. ofn.nMaxFile = sizeof( szFile );
  222. ofn.lpstrFilter = "Bat file*.bat";
  223. ofn.nFilterIndex = 1;
  224. ofn.lpstrFileTitle = NULL;
  225. ofn.nMaxFileTitle = 0;
  226. ofn.lpstrInitialDir = NULL;
  227. ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  228. // Display the Open dialog box. 
  229. if ( GetOpenFileName( &ofn ) == TRUE ) 
  230. {
  231. m_csExePath = ofn.lpstrFile;
  232. UpdateData( FALSE );
  233. }
  234. }
  235. void __stdcall CUpdateClientDlg::EventNotify( LPVOID lpParam, 
  236. const unsigned long &ulnEventType )
  237. {
  238. CUpdateClientDlg *pThis = reinterpret_cast< CUpdateClientDlg * >( lpParam );
  239. ASSERT( pThis );
  240. try
  241. {
  242. pThis->_EventNotify( ulnEventType );
  243. }
  244. catch(...)
  245. {
  246. }
  247. }
  248. void CUpdateClientDlg::_EventNotify( const unsigned long &ulnEventType )
  249. {
  250. switch( ulnEventType )
  251. {
  252. case enumServerConnectCreate:
  253. break;
  254. case enumServerConnectClose:
  255. break;
  256. }
  257. }
  258. void CUpdateClientDlg::OnTimer(UINT nIDEvent) 
  259. {
  260. if ( m_pClient )
  261. {
  262. size_t datalength = 0;
  263. const void *pData = m_pClient->GetPackFromServer( datalength );
  264. if ( pData && datalength )
  265. {
  266. BYTE cProtocol = *( const char *)pData;
  267. switch( cProtocol )
  268. {
  269. case enumWork:
  270. Work();
  271. break;
  272. default:
  273. break;
  274. }
  275. }
  276. }
  277. CDialog::OnTimer(nIDEvent);
  278. }
  279. void CUpdateClientDlg::Work()
  280. {
  281. CString str, str2;
  282. int nLen;
  283. for ( int i=0; i < m_ctlTaskList.GetCount(); i++)
  284. {
  285. nLen = m_ctlTaskList.GetTextLen( i );
  286. m_ctlTaskList.GetText( i, str.GetBuffer( nLen ) );
  287. str.ReleaseBuffer();
  288. char *pData = str.GetBuffer(0);
  289. if ( !pData )
  290. {
  291. continue;
  292. }
  293. PROCESS_INFORMATION pi;
  294. STARTUPINFO si;
  295. // Set up the start up info struct.
  296. ZeroMemory(&si,sizeof(STARTUPINFO));
  297. si.cb = sizeof(STARTUPINFO);
  298. si.dwFlags = STARTF_USESTDHANDLES;
  299. // Use this if you want to hide the child:
  300. //     si.wShowWindow = SW_HIDE;
  301. // Note that dwFlags must include STARTF_USESHOWWINDOW if you want to
  302. // use the wShowWindow flags.
  303. CreateProcess(NULL,pData,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
  304. // Set global child process handle to cause threads to exit.
  305. // Close any unnecessary handles.
  306. CloseHandle(pi.hThread);
  307. }
  308. }