// MemStatConfigDlg.cpp : ±¸Çö ÆÄÀÏ // #include "stdafx.h" #include "ServiceInstaller.h" #include ".\ServiceInstallerdlg.h" #include "ServiceScriptInfo.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // ÀÀ¿ë ÇÁ·Î±×·¥ Á¤º¸¿¡ »ç¿ëµÇ´Â CAboutDlg ´ëÈ­ »óÀÚÀÔ´Ï´Ù. #define MAX_ERRORMSG_SIZE 128 class CAboutDlg : public CDialog { public: CAboutDlg(); // ´ëÈ­ »óÀÚ µ¥ÀÌÅÍ enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Áö¿ø // ±¸Çö protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CServiceInstallerDlg ´ëÈ­ »óÀÚ CServiceInstallerDlg::CServiceInstallerDlg(CWnd* pParent /*=NULL*/) : CDialog(CServiceInstallerDlg::IDD, pParent) , m_strEditExplaination(_T("")) , m_strNowStatus(_T("")) , m_strServiceName(_T("")) , m_nServiceType(0) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_nComboIdx = 0; m_nServiceType = 0; } void CServiceInstallerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_EXPLANATION, m_strEditExplaination); DDX_Text(pDX, IDC_STATIC_NOW_STATUS, m_strNowStatus); DDX_Text(pDX, IDC_STATIC_NAME, m_strServiceName); DDX_Control(pDX, IDC_COMBO_SERVICE, m_comboService); DDX_Control(pDX, IDC_COMBO_SERVICE_TYPE, m_comboServiceType); } BEGIN_MESSAGE_MAP(CServiceInstallerDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BTN_INSTALL, OnBnClickedBtnInstall) ON_BN_CLICKED(IDC_BTN_UNINSTALL, OnBnClickedBtnUninstall) ON_BN_CLICKED(IDOK, OnBnClickedOk) ON_CBN_SELCHANGE(IDC_COMBO_SERVICE, OnCbnSelchangeComboService) ON_CBN_SELCHANGE(IDC_COMBO_SERVICE_TYPE, OnCbnSelchangeComboServiceType) END_MESSAGE_MAP() // CServiceInstallerDlg ¸Þ½ÃÁö 󸮱â BOOL CServiceInstallerDlg::OnInitDialog() { CDialog::OnInitDialog(); // ½Ã½ºÅÛ ¸Þ´º¿¡ "Á¤º¸..." ¸Þ´º Ç׸ñÀ» Ãß°¡ÇÕ´Ï´Ù. // IDM_ABOUTBOX´Â ½Ã½ºÅÛ ¸í·É ¹üÀ§¿¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // ÀÌ ´ëÈ­ »óÀÚÀÇ ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÁÖ Ã¢ÀÌ ´ëÈ­ »óÀÚ°¡ ¾Æ´Ò °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©°¡ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. SetIcon(m_hIcon, TRUE); // Å« ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. SetIcon(m_hIcon, FALSE); // ÀÛÀº ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. // TODO: ¿©±â¿¡ Ãß°¡ ÃʱâÈ­ ÀÛ¾÷À» Ãß°¡ÇÕ´Ï´Ù. if( !m_info.LoadData() ) AfxMessageBox( "¼­ºñ½º µ¥ÀÌÅÍ Àб⠿¡·¯" ); // ¼­ºñ½º ÄÞº¸¹Ú½º ÃʱâÈ­ InitServiceCombo(); m_comboService.SetCurSel( m_nComboIdx ); m_comboServiceType.SetCurSel( m_nServiceType ); DispCurStatus(); SetWindowText( "ServiceInstaller" ); return TRUE; // ÄÁÆ®·Ñ¿¡ ´ëÇÑ Æ÷Ä¿½º¸¦ ¼³Á¤ÇÏÁö ¾ÊÀ» °æ¿ì TRUE¸¦ ¹ÝȯÇÕ´Ï´Ù. } void CServiceInstallerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // ´ëÈ­ »óÀÚ¿¡ ÃÖ¼ÒÈ­ ´ÜÃ߸¦ Ãß°¡ÇÒ °æ¿ì ¾ÆÀÌÄÜÀ» ±×¸®·Á¸é // ¾Æ·¡ Äڵ尡 ÇÊ¿äÇÕ´Ï´Ù. ¹®¼­/ºä ¸ðµ¨À» »ç¿ëÇÏ´Â MFC ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©¿¡¼­ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. void CServiceInstallerDlg::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 { CDialog::OnPaint(); } } // »ç¿ëÀÚ°¡ ÃÖ¼ÒÈ­µÈ âÀ» ²ô´Â µ¿¾È¿¡ Ä¿¼­°¡ Ç¥½ÃµÇµµ·Ï ½Ã½ºÅÛ¿¡¼­ // ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. HCURSOR CServiceInstallerDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CServiceInstallerDlg::OnBnClickedBtnInstall() { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. if( m_nComboIdx == 0 ) { // Àü ¼­ºñ½º¸¦ µî·ÏÇÑ´Ù. // ÇöÁ¦ µî·ÏµÇ¾î ÀÖ´Â ½áºñ½º´Â Á¦¿ÜÇÑ´Ù. for( int i = 1; i < m_info.GetServiceCount(); i++ ) InstallService( i, m_nServiceType ); } else { InstallService( m_nComboIdx, m_nServiceType ); } } void CServiceInstallerDlg::OnBnClickedBtnUninstall() { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. if( m_nComboIdx == 0 ) { // Àü ¼­ºñ½º¸¦ µî·ÏÇÑ´Ù. // ÇöÁ¦ µî·ÏµÇ¾î ÀÖ´Â ½áºñ½º´Â Á¦¿ÜÇÑ´Ù. for( int i = 1; i < m_info.GetServiceCount(); i++ ) UnInstallService( i ); } else { UnInstallService( m_nComboIdx ); } } void CServiceInstallerDlg::OnBnClickedOk() { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. OnOK(); } void CServiceInstallerDlg::DispCurStatus() { if( m_nComboIdx == 0 ) { m_strServiceName.Format( "¼­ºñ½º À̸§ : Àüü " ); m_strNowStatus = ""; } else if( m_nComboIdx > 0 ) { TCHAR szServiceName[MAX_PATH]; m_info.GetServiceName( szServiceName, MAX_PATH, m_nComboIdx ); if( !szServiceName ) { MessageBox( NULL, "ÇØ´ç ¼­ºñ½º À̸§¸¦ °¡Áö°í ¿Ã¼ö ¾ø½À´Ï´Ù." ); return; } SC_HANDLE hScm, hSrv; hScm = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE ); if( NULL == hScm ) { MessageBox( "SCM¸¦ ¿­¼ö ¾ø½À´Ï´Ù.", "¾Ë¸²", MB_OK ); return; } m_strServiceName.Format( "¼­ºñ½º À̸§ : %s ", szServiceName ); // ¼­ºñ½ºÀÇ ÇÚµéÀ» ±¸ÇÑ´Ù. hSrv = OpenService( hScm, szServiceName, SERVICE_ALL_ACCESS ); if( NULL == hSrv ) m_strNowStatus = "¼­ºñ½º°¡ ¼³Ä¡µÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù."; else m_strNowStatus = "¼­ºñ½º°¡ ¼³Ä¡µÇ¾î ÀÖ½À´Ï´Ù."; CloseServiceHandle( hScm ); } else return; UpdateData( FALSE ); } void CServiceInstallerDlg::OnCbnSelchangeComboService() { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. m_nComboIdx = m_comboService.GetCurSel(); DispCurStatus(); } void CServiceInstallerDlg::InitServiceCombo(void) { // ¼­ºñ½º ¾îÇø®ÄÉÀÌ¼Ç ÄÞº¸ ¼³Á¤ m_comboService.ResetContent(); m_comboService.AddString("Àüü"); for( int i = 1; i <= m_info.GetServiceCount(); i++ ) { TCHAR szName[MAX_PATH]; m_info.GetAppName( szName, MAX_PATH, i ); m_comboService.AddString( szName ); } // ¼­ºñ½º ¼³Ä¡ Á¾·ù ÄÞº¸ ¼³Á¤ m_comboServiceType.ResetContent(); m_comboServiceType.AddString("¼öµ¿½ÃÀÛ"); m_comboServiceType.AddString("ÀÚµ¿½ÃÀÛ"); } //¼­ºñ½º¸¦ ¼³Ä¡ÇÑ´Ù. BOOL CServiceInstallerDlg::InstallService( int nAppNum, int nServiceType ) { SC_HANDLE hScm, hSrv; SERVICE_DESCRIPTION lpDes; //SCMÀ» ¿¬´Ù. hScm = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE ); if( hScm == NULL ) { MessageBox( "SCMÀ» ¿­ ¼ö ¾ø½À´Ï´Ù.", "¾Ë¸²", MB_OK ); return FALSE; } //¼­ºñ½º¸¦ µî·ÏÇÑ´Ù. TCHAR szServiceName[MAX_PATH], szDispName[MAX_PATH], szBinPath[MAX_PATH]; m_info.GetServiceName( szServiceName, MAX_PATH, nAppNum ); m_info.GetDisplayName( szDispName, MAX_PATH, nAppNum ); m_info.GetBinPath( szBinPath, MAX_PATH, nAppNum ); int nStartType = 0; if( nServiceType == 0 ) nStartType = SERVICE_DEMAND_START; else if( nServiceType == 1) nStartType = SERVICE_AUTO_START; hSrv = CreateService( hScm, szServiceName, szDispName, SERVICE_PAUSE_CONTINUE | SERVICE_CHANGE_CONFIG, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, nStartType, SERVICE_ERROR_IGNORE, szBinPath, NULL, NULL, NULL, NULL, NULL ); if( NULL == hSrv ) { DWORD dwError = GetLastError(); char szErr[MAX_ERRORMSG_SIZE]; wsprintf( szErr, " ¼³Ä¡ÇÏÁö ¸øÇß½À´Ï´Ù. ¿¡·¯ÄÚµå = %d ", dwError ); MessageBox( szErr, "¾Ë¸²", MB_OK ); } else { UpdateData( TRUE ); //¼³¸íÀ» µî·ÏÇÑ´Ù. lpDes.lpDescription = (LPSTR)m_strEditExplaination.GetString(); ChangeServiceConfig2( hSrv, SERVICE_CONFIG_DESCRIPTION, &lpDes ); m_strNowStatus = "¼³Ä¡µÇ¾î ÀÖ½À´Ï´Ù."; CloseServiceHandle( hSrv ); UpdateData( FALSE ); } CloseServiceHandle( hScm ); return TRUE; } //¼­ºñ½º¸¦ Á¦°ÅÇÑ´Ù. BOOL CServiceInstallerDlg::UnInstallService( int nAppNum ) { SC_HANDLE hScm, hSrv; SERVICE_STATUS ss; TCHAR szServiceName[MAX_PATH]; m_info.GetServiceName( szServiceName, MAX_PATH, nAppNum ); // SCM¸¦ ¿¬´Ù. hScm = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE ); if( NULL == hScm ) { MessageBox( "SCM¸¦ ¿­¼ö ¾ø½À´Ï´Ù.", "¾Ë¸²", MB_OK ); return FALSE; } // ¼­ºñ½ºÀÇ ÇÚµéÀ» ±¸ÇÑ´Ù. hSrv = OpenService( hScm, szServiceName, SERVICE_ALL_ACCESS ); if( NULL == hSrv ) { CloseServiceHandle( hScm ); MessageBox( "¼­ºñ½º°¡ ¼³Ä¡µÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù", "¾Ë¸²", MB_OK ); return FALSE; } // ½ÇÇàÁßÀ̸é ÁßÁö½ÃŲ´Ù. QueryServiceStatus( hSrv, &ss ); if( ss.dwCurrentState != SERVICE_STOPPED ) { ControlService( hSrv, SERVICE_CONTROL_STOP, &ss ); Sleep(2000); } // ¼­ºñ½º Á¦°Å if( DeleteService( hSrv ) ) { m_strNowStatus = "¼³Ä¡µÇÁö ¾Ê¾Ò½À´Ï´Ù."; } else { DWORD dwError = GetLastError(); char szErr[MAX_ERRORMSG_SIZE]; wsprintf( szErr, " ¼­ºñ½º¸¦ Á¦°ÅÇÏÁö ¸øÇß½À´Ï´Ù. ¿¡·¯ÄÚµå = %d ", dwError ); MessageBox( szErr, "¾Ë¸²", MB_OK ); } CloseServiceHandle( hSrv ); CloseServiceHandle( hScm ); UpdateData( FALSE ); return TRUE; } void CServiceInstallerDlg::OnCbnSelchangeComboServiceType() { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. m_nServiceType = m_comboServiceType.GetCurSel(); }