|
Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。请见代码注释分析Windows服务- #include "stdafx.h"
- #include "myservice.h"
- #include "myserviceDlg.h"
- #include "winsvc.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CAboutDlg dialog used for App About
- class CAboutDlg : public CDialog
- {
- public:
- CAboutDlg();
- // Dialog Data
- //{{AFX_DATA(CAboutDlg)
- enum { IDD = IDD_ABOUTBOX };
- //}}AFX_DATA
- // ClassWizard generated virtual function overrides
- //{{AFX_VIRTUAL(CAboutDlg)
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
- //}}AFX_VIRTUAL
- // Implementation
- protected:
- //{{AFX_MSG(CAboutDlg)
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
- };
- CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
- {
- //{{AFX_DATA_INIT(CAboutDlg)
- //}}AFX_DATA_INIT
- }
- void CAboutDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CAboutDlg)
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
- //{{AFX_MSG_MAP(CAboutDlg)
- // No message handlers
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CMyserviceDlg dialog
- CMyserviceDlg::CMyserviceDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CMyserviceDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CMyserviceDlg)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- }
- void CMyserviceDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CMyserviceDlg)
- // NOTE: the ClassWizard will add DDX and DDV calls here
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CMyserviceDlg, CDialog)
- //{{AFX_MSG_MAP(CMyserviceDlg)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_BN_CLICKED(IDC_BSERVICE, OnBservice)
- ON_BN_CLICKED(IDC_BNOTROOT, OnBnotroot)
- ON_BN_CLICKED(IDC_BDELSER, OnBdelser)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CMyserviceDlg message handlers
- BOOL CMyserviceDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // Add "About..." menu item to system menu.
- // IDM_ABOUTBOX must be in the system command range.
- 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);
- }
- }
- // Set the icon for this dialog. The framework does this automatically
- // when the application's main window is not a dialog
- SetIcon(m_hIcon, TRUE); // Set big icon
- SetIcon(m_hIcon, FALSE); // Set small icon
-
- // TODO: Add extra initialization here
- schSCManager=OpenSCManager(NULL,NULL,GENERIC_WRITE);
- return TRUE; // return TRUE unless you set the focus to a control
- }
- void CMyserviceDlg::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if ((nID & 0xFFF0) == IDM_ABOUTBOX)
- {
- CAboutDlg dlgAbout;
- dlgAbout.DoModal();
- }
- else
- {
- CDialog::OnSysCommand(nID, lParam);
- }
- }
- // If you add a minimize button to your dialog, you will need the code below
- // to draw the icon. For MFC applications using the document/view model,
- // this is automatically done for you by the framework.
- void CMyserviceDlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // device context for painting
- SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
- // Center icon in client rectangle
- 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;
- // Draw the icon
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CDialog::OnPaint();
- }
- }
- // The system calls this to obtain the cursor to display while the user drags
- // the minimized window.
- HCURSOR CMyserviceDlg::OnQueryDragIcon()
- {
- return (HCURSOR) m_hIcon;
- }
- void CMyserviceDlg::OnBservice()
- {
-
- TCHAR szPath[512];
- //CString aa;
- //aa.Format("%s",szPath);
- //CString *bb=aa;
- ::GetModuleFileName(NULL,szPath,512);
-
- if(schSCManager)
- {
- ::AfxMessageBox("open servicemanager succeed!");
- schService=::CreateService(schSCManager,"myservice","myservice",SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,szPath,NULL,NULL,NULL,NULL,NULL);
- if(schService)
- {
- ::AfxMessageBox("create service succeed!");
- /* SERVICE_TABLE_ENTRY DispatchTable[] =
- {
- {"myservice",(LPSERVICE_MAIN_FUNCTION)MyServiceMain}, //服务程序的名称和入口点;
- {NULL ,NULL} //SERVICE_TABLE_ENTRY结构必须以"NULL"结束;
- };
- StartServiceCtrlDispatcher(DispatchTable);
- ::QueryServiceStatus(schService,ssStatus);
- ServiceStatusHandle=RegisterServiceCtrlHandler("ntkrnl",CmdControl);*/
- ::CloseServiceHandle(schService);
- }
- else
- {
- ::AfxMessageBox("create service failed!");
- }
- ::CloseServiceHandle(schSCManager);
- }
- else
- AfxMessageBox("open servicemanager failed!");
-
- }
- void CMyserviceDlg::OnBnotroot()
- {
- ::ChangeServiceConfig(schService,SERVICE_NO_CHANGE,SERVICE_DISABLED,SERVICE_DEMAND_START,NULL,NULL,NULL,NULL,NULL,NULL,"my service");
- }
- void CMyserviceDlg::OnBdelser()
- {
- schService=::OpenService(schSCManager,"myservice",DELETE);
- if(schService)
- {
- AfxMessageBox("Delete Service succeed!");
- ::DeleteService(schService);
- ::CloseServiceHandle(schService);
- }
- else
- AfxMessageBox("Delete Service failed!");
- //::DeleteFile(bb);
- }
- /*void CMyserviceDlg::MyServiceMain(DWORD argc,LPTSTR *argv)
- {
- HANDEL sshStatusHandle;
- sshStatusHandle=RegisterServiceCtrlHandler("myservice",ServiceControlHandler);
- if(!sshStatusHandle)
- goto clearnup:
- m_ssStatus.
- }*/
复制代码
作者:yincheng01 发表于2011-12-14 23:52:19 原文链接
|
|