• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            #ant

            The dreams in which I'm dying are the best I've ever had...

            Win32 Service的簡單封裝

            前段時間學習Windows程序設計,剛好學到Win32 Service,于是寫了兩個簡單的類:BaseService和ServiceCtrl。雖然功能比較簡單,但是也能適用于大多數情況。下面介紹一下簡單用法,如果你剛好需要寫一些簡單的服務程序,這兩個類也許能派上用場:

            1. BaseService
            BaseService.h

             1  #ifndef BASE_SERVICE_H
             2 
            #define BASE_SERVICE_H
             3 

             4 class  BaseService {
             5 public
            :
             6 
                explicit BaseService(LPCTSTR szServiceName,
             7                 DWORD dwServiceType =
             SERVICE_WIN32_OWN_PROCESS,
             8                 DWORD dwStartType =
             SERVICE_AUTO_START);
             9     virtual ~
            BaseService() {}
            10     bool ParseStandardArgs(int argc, char*
             argv[]);
            11 
                bool IsInstalled();
            12 
                bool Install();
            13 
                bool Uninstall();
            14 
                bool Start();
            15 private
            :
            16     virtual void Run() = 0
            ;
            17     virtual bool OnInitialize() { return true
            ; }
            18     virtual void
             OnStop() {}
            19     virtual void
             OnPause() {}
            20     virtual void
             OnContinue() {}
            21     virtual void
             OnInterrogate() {}
            22     virtual void
             OnShutdown() {}
            23     virtual void
             OnUserControl(DWORD dwControl) {}
            24 
                ...
            25 
            };
            26 

            27 #endif/*BASE_SERVICE_H*/

            要實現自己的服務類只需從BaseService繼承并且Override相關的virtual函數即可,下面示范一個BeepService類,該服務只是簡單地每隔2秒beep一下,為了簡單所有代碼均放在.h文件中:
            BeepService.h

             1  #ifndef BEEP_SERVICE_H
             2 
            #define BEEP_SERVICE_H
             3 

             4 #include "BaseService.h"
             5 
             6 class BeepService : public  BaseService {
             7 public
            :
             8 
                BeepService(LPCTSTR szServiceName)
             9 
                    :BaseService(szServiceName)
            10         ,m_bPaused(false
            )
            11         ,m_bRunning(false
            ) {}
            12 

            13     virtual void OnStop() { m_bRunning = false ; }
            14     virtual void OnPause() { m_bPaused = true
            ; }
            15     virtual void OnContinue() { m_bPaused = false
            ; }
            16     virtual void
             Run() {
            17         m_bRunning = true
            ;
            18         while
             (m_bRunning) {
            19             if (!
            m_bPaused)
            20                 Beep(800800
            );
            21             Sleep(2000
            );
            22 
                    }
            23 
                }
            24 private
            :
            25     volatile
             bool m_bPaused;
            26     volatile
             bool m_bRunning;
            27 
            };
            28 

            29 #endif/*BEEP_SERVICE_H*/

            通常來說只須要Override上面的4個virtual函數就OK了:
            Run()中進行實際的工作,OnStop(),OnPause(),OnContinue()則是為了響應Service Control Manager的控制。

            test.cpp

             1 #include <windows.h>
             2 #include <tchar.h>
             3 #include <stdio.h>
             4 #include "BeepService.h"
             5 
             6 int main(int argc, char * argv[]) {
             7 

             8     BeepService beepService(_T("BeepService" ));
             9     if (!
            beepService.ParseStandardArgs(argc, argv)) {
            10         if
             (beepService.IsInstalled()) {
            11             if (!
            beepService.Start())
            12                 printf("The service can not run from command line.\n"
            );
            13         } else
             {
            14             printf("The service is not installed, "

            15                 "use \"%-i\" to install.\n", argv[0 ]);
            16 
                    }
            17 
                }
            18     return 0
            ;
            19 }

            假設編譯后生成的exe文件為beep.exe,則在命令行中可以如下使用:
            (1). beep -i    安裝service(安裝以后系統運行時會自動啟動)
            (2). beep -u   卸載service(如果service正在運行,則先停止service再卸載)
            BaseServiced 的ParseStandardArgs正是用來解析上述兩個命令。

            2. ServiceCtrl
            雖然Windows自帶的Service Control Manager可以控制服務程序,但是很多時候我們都需要用代碼控制,這就用到ServiceCtrl類,該類的接口如下:
            ServiceCtrl.h

             1  #ifndef SERVICE_CTRL_H
             2 
            #define SERVICE_CTRL_H
             3 

             4 class  ServiceCtrl {
             5 public
            :
             6 
                ServiceCtrl(LPCTSTR szServiceName);
             7     ~
            ServiceCtrl();
             8 
                bool Start();
             9 
                bool Pause();
            10 
                bool Continue();
            11 
                bool Stop();
            12 
                bool Interrogate();
            13 
                bool UserControl(DWORD dwControl);
            14     DWORD State() const
            ;
            15 
                ...
            16 
            };
            17 

            18 #endif/*SERVICE_CTRL_H*/

            接口比較直觀沒什么好說的,看下面的示例代碼:
            test.cpp

             1 #include <windows.h>
             2 #include <tchar.h>
             3 #include <stdio.h>
             4 #include <exception>
             5 #include "BeepService.h"
             6 #include "ServiceCtrl.h"
             7 
             8 int main(int argc, char * argv[]) {
             9 

            10     try  {
            11         ServiceCtrl servCtrl(_T("BeepService"
            ));
            12         if (servCtrl.State() !=
             SERVICE_STOPPED) {
            13             printf("Service already started.\n"
            );
            14         } else
             {
            15 
                        servCtrl.Start();
            16             printf("Start.\n"
            );
            17             Sleep(6000
            );
            18 
                        servCtrl.Pause();
            19             printf("Pause.\n"
            );
            20             Sleep(6000
            );
            21 
                        servCtrl.Continue();
            22             printf("Continue.\n"
            );
            23             Sleep(6000
            );
            24 
                        servCtrl.Stop();
            25             printf("Stop.\n"
            );
            26 
                    }
            27     } catch (std::exception &
            e) {
            28         printf("%s\n"
            , e.what());
            29 
                }
            30     return 0
            ;
            31 }

            源代碼:點擊下載

            posted on 2007-09-24 13:01 螞蟻終結者 閱讀(3756) 評論(5)  編輯 收藏 引用 所屬分類: C++

            Feedback

            # re: Win32 Service的簡單封裝 2007-09-24 13:28 Minidx全文檢索

            不錯,雖然簡單,卻很實用??!  回復  更多評論   

            # re: Win32 Service的簡單封裝 2007-09-24 14:05 iterator

            簡單實用,收下了!  回復  更多評論   

            # re: Win32 Service的簡單封裝[未登錄] 2007-09-24 17:43 exile

            不錯不錯  回復  更多評論   

            # re: Win32 Service的簡單封裝[未登錄] 2007-09-24 18:20 eXile

            剛準備自己寫一個呢, 真是超爽啊, 太謝謝了....  回復  更多評論   

            # re: Win32 Service的簡單封裝 2007-09-25 15:17 夢在天涯

            不錯,很強,我看過C#些的,她有wizard比較簡單1  回復  更多評論   

            久久精品国产第一区二区| 久久精品人人做人人爽97 | 精品国产福利久久久| 久久亚洲精品国产精品婷婷| 久久乐国产精品亚洲综合| 精品无码久久久久久久久久| 品成人欧美大片久久国产欧美...| 久久久精品免费国产四虎| 久久婷婷国产麻豆91天堂| 国产成人香蕉久久久久| 热久久国产欧美一区二区精品| 久久国产视频99电影| 久久天天躁狠狠躁夜夜2020一| 老男人久久青草av高清| 亚洲AV无码久久寂寞少妇| 久久久久亚洲AV无码麻豆| 一本大道加勒比久久综合| 青青国产成人久久91网| 蜜桃麻豆www久久国产精品| 伊人久久久AV老熟妇色| 国内精品伊人久久久久| 人妻丰满?V无码久久不卡| 少妇精品久久久一区二区三区| 久久精品无码专区免费青青| 国产精品美女久久久网AV| 久久亚洲欧洲国产综合| 亚洲精品无码成人片久久| 久久久无码一区二区三区| 久久久久亚洲AV无码专区网站| 亚洲国产成人精品91久久久| 亚洲伊人久久精品影院| 亚洲国产精品久久久久久| 国内精品久久久久影院薰衣草| 一本大道久久a久久精品综合| 精品久久亚洲中文无码| 精品精品国产自在久久高清| 亚洲美日韩Av中文字幕无码久久久妻妇| 99久久99久久精品国产片果冻| 亚洲国产精品久久66| 久久超碰97人人做人人爱| 尹人香蕉久久99天天拍|