• <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的簡(jiǎn)單封裝

            前段時(shí)間學(xué)習(xí)Windows程序設(shè)計(jì),剛好學(xué)到Win32 Service,于是寫了兩個(gè)簡(jiǎn)單的類:BaseService和ServiceCtrl。雖然功能比較簡(jiǎn)單,但是也能適用于大多數(shù)情況。下面介紹一下簡(jiǎn)單用法,如果你剛好需要寫一些簡(jiǎn)單的服務(wù)程序,這兩個(gè)類也許能派上用場(chǎng):

            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*/

            要實(shí)現(xiàn)自己的服務(wù)類只需從BaseService繼承并且Override相關(guān)的virtual函數(shù)即可,下面示范一個(gè)BeepService類,該服務(wù)只是簡(jiǎn)單地每隔2秒beep一下,為了簡(jiǎn)單所有代碼均放在.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*/

            通常來(lái)說(shuō)只須要Override上面的4個(gè)virtual函數(shù)就OK了:
            Run()中進(jìn)行實(shí)際的工作,OnStop(),OnPause(),OnContinue()則是為了響應(yīng)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 }

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

            2. ServiceCtrl
            雖然Windows自帶的Service Control Manager可以控制服務(wù)程序,但是很多時(shí)候我們都需要用代碼控制,這就用到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*/

            接口比較直觀沒(méi)什么好說(shuō)的,看下面的示例代碼:
            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 }

            源代碼:點(diǎn)擊下載

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

            Feedback

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

            不錯(cuò),雖然簡(jiǎn)單,卻很實(shí)用!!  回復(fù)  更多評(píng)論   

            # re: Win32 Service的簡(jiǎn)單封裝 2007-09-24 14:05 iterator

            簡(jiǎn)單實(shí)用,收下了!  回復(fù)  更多評(píng)論   

            # re: Win32 Service的簡(jiǎn)單封裝[未登錄](méi) 2007-09-24 17:43 exile

            不錯(cuò)不錯(cuò)  回復(fù)  更多評(píng)論   

            # re: Win32 Service的簡(jiǎn)單封裝[未登錄](méi) 2007-09-24 18:20 eXile

            剛準(zhǔn)備自己寫一個(gè)呢, 真是超爽啊, 太謝謝了....  回復(fù)  更多評(píng)論   

            # re: Win32 Service的簡(jiǎn)單封裝 2007-09-25 15:17 夢(mèng)在天涯

            不錯(cuò),很強(qiáng),我看過(guò)C#些的,她有wizard比較簡(jiǎn)單1  回復(fù)  更多評(píng)論   

            久久国产精品一国产精品金尊 | 伊人久久大香线焦综合四虎| 一本大道加勒比久久综合| 亚洲精品午夜国产va久久| 精品久久久久久无码专区不卡| 久久国产精品久久久| 国内精品久久久久影院老司| 精品亚洲综合久久中文字幕| 精品久久久久久久国产潘金莲 | 久久婷婷色香五月综合激情| 成人国内精品久久久久影院| 亚洲精品国精品久久99热| 精品久久一区二区三区| 久久国产色av免费看| 久久av免费天堂小草播放| 久久久久成人精品无码中文字幕| 久久综合久久综合亚洲| 久久av免费天堂小草播放| 狠狠色丁香婷综合久久| 日韩人妻无码精品久久免费一| 午夜精品久久久久久影视777| 日本道色综合久久影院| 欧美牲交A欧牲交aⅴ久久| 久久久高清免费视频| 久久久久99精品成人片牛牛影视| 久久精品午夜一区二区福利 | 久久精品国产精品亚洲人人| 久久亚洲国产中v天仙www| 久久99国产综合精品免费| 亚洲国产一成人久久精品| 久久久久久伊人高潮影院| 无码任你躁久久久久久| 欧美色综合久久久久久| 青青草原综合久久大伊人导航| 国产精品熟女福利久久AV| 99久久精品免费看国产一区二区三区| 精品久久久久久国产| 久久青青草原国产精品免费| 88久久精品无码一区二区毛片 | 久久不见久久见免费影院www日本| 久久这里只精品国产99热|