亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[VB][WIN]如何利用VB編寫NT服務(wù)程序-NTSVC.OCX

admin
2013年11月11日 21:57 本文熱度 5959

如何利用VB編寫NT服務(wù)程序-NTSVC.OCX

一、NT服務(wù)程序
    所謂NT服務(wù),實(shí)際上就是一個(gè)可以在系統(tǒng)啟動(dòng)時(shí)自動(dòng)在一定身份下啟動(dòng)的伴隨系統(tǒng)長(zhǎng)時(shí)間存在的進(jìn)程。象FTP server、HTTP server、脫機(jī)打印等都是采用NT服務(wù)的形式提供的。這實(shí)際上類似Unix的root daemon進(jìn)程。NT服務(wù)歸納起來(lái),NT服務(wù)又以下幾個(gè)特征:

1、可以自啟動(dòng),不需要交互啟動(dòng)。這對(duì)于服務(wù)器來(lái)說(shuō)是一個(gè)重要的特征。當(dāng)然,你可以決定服務(wù)是否自啟動(dòng),甚至可以屏蔽某個(gè)服務(wù)。
    2、NT服務(wù)沒有用戶界面,基本上類似一個(gè)DOS 程序,因?yàn)镹T服務(wù)必須長(zhǎng)時(shí)間運(yùn)行,所以不想普通win32進(jìn)程一樣有自己的界面。但是NT服務(wù)可以同用戶有界面交互,這是一類特殊的服務(wù)進(jìn)程??梢酝ㄟ^(guò)NT的任務(wù)管理器來(lái)看到服務(wù)進(jìn)程。
    3、NT服務(wù)通過(guò)SCM(Services Control Manager)接口來(lái)管理,安裝、啟動(dòng)、停止、撤除等都需要SCM的接口功能來(lái)進(jìn)行??刂泼姘宓姆?wù)控制器就是利用SCM接口來(lái)管理系統(tǒng)中的所有服務(wù)的。實(shí)際上,還有一些可以控制服務(wù)的程序或者命令,有net.exe 、服務(wù)器管理器等 、SCM.exe等。
    4、這些進(jìn)程都以一定的身份運(yùn)行,以方便進(jìn)行服務(wù)器資源的存取。一般情況下使用域中的LocalSystem賬號(hào)運(yùn)行,此賬號(hào)對(duì)本機(jī)上的大多數(shù)資源(除非特別禁止)有完全的存取權(quán)限,這樣可以保證服務(wù)程序的“強(qiáng)大”。但是,也有些服務(wù)采用特別的賬號(hào)運(yùn)行,你也可以特別設(shè)定一個(gè)服務(wù)的帳號(hào)。
    5、由系統(tǒng)自動(dòng)以線程方式運(yùn)行,一般情況下不過(guò)多占用系統(tǒng)資源,這同普通的進(jìn)程有所區(qū)別,如果不采用線程方式,一般進(jìn)程往往消耗整個(gè)CPU資源。一般需要時(shí)時(shí)存在,又不能過(guò)多消耗資源的任務(wù)以服務(wù)來(lái)實(shí)現(xiàn)最合適。

 

二、服務(wù)控件
    一般認(rèn)為編寫NT服務(wù)需要使用C/C++來(lái)實(shí)現(xiàn),VC6利用ATL向?qū)?lái)提供一個(gè)基本的服務(wù)框架。具體實(shí)現(xiàn)步驟為:FileàNew…àATL COM AppWizardàserviceàFinish.但是使用VC編寫NT服務(wù)需要編寫太多的代碼,這也意味著需要太多的調(diào)試、維護(hù)。實(shí)際上,NT服務(wù)不是必須由C/C++才可以編寫的,實(shí)際上可以由任何能夠?qū)崿F(xiàn)上一節(jié)幾個(gè)特點(diǎn)的任何語(yǔ)言實(shí)現(xiàn),包括VB。

VB編寫服務(wù)有那些好處呢,至少可以列出以下幾條:

1、編碼簡(jiǎn)單,熟悉Vb語(yǔ)法的任何人理解本文后都可編寫。
    2、意味著修改服務(wù)實(shí)現(xiàn)的邏輯簡(jiǎn)單,維護(hù)簡(jiǎn)單。
    3、可以利用幾乎大多數(shù)的Vb中的組件功能,編寫一個(gè)強(qiáng)大的服務(wù),譬如ado等,如果用VC來(lái)實(shí)現(xiàn),相信任何人都會(huì)發(fā)怵。
    4、(牽強(qiáng)一點(diǎn))可以證明Vb在Bill的天空下是多么強(qiáng)大。
    那么,Vb如何實(shí)現(xiàn)NT服務(wù)編寫呢?據(jù)我所至,至少有兩種途徑:

1、  按照C/C++的思路利用WinAPI來(lái)實(shí)現(xiàn)。

2、  利用組件按照Vb傳統(tǒng)方式實(shí)現(xiàn)。

如果利用方法1實(shí)際上是照搬C/C++的套路,如果有更好的路子可以實(shí)現(xiàn),相信任何人都不會(huì)走這條“絕路”,因?yàn)橄鄬?duì)于其他語(yǔ)言來(lái)說(shuō)這種編程完全喪失了Vb自身得特點(diǎn)同時(shí)也沒有獲得其他語(yǔ)言的任何優(yōu)勢(shì)。在這里,想告訴大家的是利用OCX來(lái)實(shí)現(xiàn)一個(gè)服務(wù)。如果您在MSDN中搜索Samples/msdn/techart/4920/,您可以看到一個(gè)已經(jīng)編寫好的vc5的工程文件。編譯這個(gè)工程實(shí)際上會(huì)得到一個(gè)ntsvc.ocx的。如果您對(duì)C/C++不熟悉,可以從http://www.mywebtech.net/download/ntsvc.zip 下載一個(gè)ntsvc.ocx,此OCX是我從backoffice碟中獲得的,將其拷貝到/winnt/system32/下,利用regsvr32  ntsvc.ocx命令注冊(cè)之。這樣,您的Vb就可以從project/components…引出的對(duì)話框列表中看到名為“Microsoft NT Service Control”項(xiàng)。此組件擁有我們創(chuàng)建一個(gè)服務(wù)的基本的功能,如果要編寫一個(gè)NT服務(wù),我們將其拖進(jìn)我們的窗體,然后設(shè)定其屬性,調(diào)用其與系統(tǒng)、注冊(cè)表、SCM交互的功能就可以實(shí)現(xiàn)完成一個(gè)服務(wù)了。

我們首先了解這個(gè)組件的屬性,并向大家解釋這些屬性的用法:
    Account String ,賬號(hào)屬性,即本NT服務(wù)在哪一個(gè)NT域賬號(hào)下運(yùn)行,缺省是LocalSystem賬號(hào),實(shí)際上大多數(shù)的NT服務(wù)都可以在此賬號(hào)下安全圓滿的運(yùn)行。
    ControlsAccepted Long,此服務(wù)接受那些SCM控制,為以下值:
    0     允許Start 以及 Stop .

       2     允許Pause 以及 Continue .

4     允許 shutdown 。

其他值,用戶自定義的某些事件.
利用這個(gè)屬性,您可以自己決定NT服務(wù)進(jìn)程某個(gè)(譬如某個(gè)不可中斷操作)時(shí)刻是否允許SCM停止、暫停、啟動(dòng)等操作。
    Dependencies String ,如果您編寫的服務(wù)依賴于某個(gè)或者某些服務(wù)才能正常運(yùn)行,您必須在注冊(cè)服務(wù)時(shí)指定依賴的服務(wù)列表。Dependencies按照依賴順序以chr(0)來(lái)分隔多個(gè)服務(wù),最后必須以兩個(gè)chr(0)結(jié)束。(大家可以看到這是一個(gè)C/C++的存在痕跡)
    DisplayName String,顯示名,NT服務(wù)以何種名字顯示給察看者。
    Interactive   Boolean ,是否允許有同桌面用戶有交互的部分。
    LoadOrderGroup String,同Dependencies相關(guān),決定如果本服務(wù)啟動(dòng)之前,那些服務(wù)必須啟動(dòng),格式也類似,也以chr(0)分割,連續(xù)的兩個(gè)chr(0)結(jié)尾。
    Password String,服務(wù)啟動(dòng)的口令,如果使用缺省得賬號(hào),就沒有必要設(shè)定服務(wù)啟動(dòng)的帳號(hào)。
    ServiceName String,服務(wù)名,如果使用net.exe來(lái)控制服務(wù),net.exe的指定那一個(gè)服務(wù)的參數(shù)就是此屬性中的字符串。
    StartMode 枚舉型,具體為:
    vcStartAutomatic     2     服務(wù)可以自己?jiǎn)?dòng)

svcStartManual 3     服務(wù)手動(dòng)啟動(dòng)

svcStartDisabled       4       服務(wù)不能自啟動(dòng)
    另外有一個(gè)Debug屬性,不做討論。

我們要將一個(gè)VB程序當(dāng)作一個(gè)NT服務(wù),必須向系統(tǒng)作一些“申請(qǐng)”,而相應(yīng)的工作VB是無(wú)法很好的完成的。所以,NTSVC.ocx提供了相應(yīng)的方法留作我們想系統(tǒng)傳遞相關(guān)信息。
    Install ,將當(dāng)前Vb程序安裝成NT服務(wù),在此之前,您必須至少設(shè)置DisplayName, ServiceName, ControlsAccepted以及StartMode等屬性。除此之外您可能還要設(shè)置Account、Password、LoadOrderGroup、Dependencies等。這些信息的設(shè)置正確與否,決定您的服務(wù)程序能否正常啟動(dòng)運(yùn)行。
    Uninstall, 將當(dāng)前NTSVC.ocx指定的服務(wù)從系統(tǒng)注冊(cè)表中刪除。NT服務(wù)取決于系統(tǒng)服務(wù)注冊(cè)表的設(shè)定,這是一個(gè)眾所周知的秘密。
    StartService,將指定的服務(wù)啟動(dòng),如果該服務(wù)注冊(cè)了。
    StopService,停止服務(wù),如果服務(wù)正在運(yùn)行。
    LogEvent ,記錄服務(wù)事件。服務(wù)運(yùn)行中,可能發(fā)生錯(cuò)誤以及意料不到的事件,這些可以通過(guò)此方法記錄下來(lái),供管理員通過(guò)“事件察看器”察看相關(guān)的信息,以最優(yōu)化服務(wù)。此方法有三個(gè)參數(shù)event, id, message. Event指發(fā)生的事件類型,可以設(shè)為以下值:
    svcEventError 1     錯(cuò)誤事件 
    svcEventWarning     2     警告事件.
    svcEventInformation       4       提供參考信息.

svcEventAuditSuccess      8       審計(jì)成功.

svcEventAuditFailure       10       審計(jì)失敗
除了以上方法,可能用戶還需要讀寫注冊(cè)表,此控件還提供了注冊(cè)表的訪問方法:
DeleteSetting  (section[, key])
GetAllSettings(section)
GetSetting(section, key[, default])
SaveSetting(section, key, setting).

 

 

 

 

三、編寫服務(wù)
    了解以上內(nèi)容,下面我們開始來(lái)設(shè)計(jì)一個(gè)服務(wù),通過(guò)例子,讓大家理解如何在VB中編寫服務(wù).
    在此之前,我們決定寫一個(gè)什么樣的服務(wù)。我參考C++Build中的一個(gè)例子,寫一個(gè)不斷報(bào)警的服務(wù)進(jìn)程。該進(jìn)程啟動(dòng)后在后臺(tái)不斷間隔5秒發(fā)出Beep叫,這可以讓大家更深切知道此服務(wù)的存在,雖然有些令人討厭。服務(wù)的名字為VBBeepSVC,在SCM中顯示為The VB NT SVC View。
   跟著我一起來(lái)吧!
   1、創(chuàng)建工程,設(shè)定相關(guān)使用到的控件。
      所有的Vb的控件必須有一個(gè)Form作為載體,所以,首先我們創(chuàng)建一個(gè)標(biāo)準(zhǔn)工程,選擇菜單project—>Components…,然后選?。∕icrosoft NT Service Control),會(huì)在Toolbar中出現(xiàn)NT服務(wù)控件。再拖一個(gè)Timer控件到Form上。然后保存一下?;旧?,創(chuàng)建過(guò)程完成。
   2、設(shè)定控件屬性。
      選中NtSvc.ocx實(shí)例,在屬性欄中設(shè)定:DisplayName: The VB NT SVC View,ServiceName: VBBeepSVC,StartMode:3(手動(dòng)啟動(dòng)服務(wù)).其他的就缺省吧。
      由于我們希望每個(gè)5秒就beep一次,所以我們必須依靠一種定時(shí)機(jī)制來(lái)實(shí)現(xiàn),所以我們將timer的Interval設(shè)定位5000毫秒。
      以上屬性的設(shè)定視您的需要而定,我只是說(shuō)在我的VBBeepSVC中如此設(shè)定足夠了。
   3、編寫代碼,實(shí)現(xiàn)服務(wù)邏輯以及服務(wù)安裝、撤除。
      因?yàn)榉?wù)程序?qū)嶋H上是一個(gè)Exe文件,并且需要自己解決安裝、撤除問題,因此需要在此程序中加入利用NT服務(wù)控件來(lái)實(shí)現(xiàn)安裝、撤除問題。那么,應(yīng)當(dāng)在什么時(shí)候進(jìn)行了。VB程序啟動(dòng)時(shí)正時(shí)Form裝載的時(shí)候,所以,我們需要在窗體的Load事件中加入一些代碼:
On Error GoTo Err_Load  ‘如果出現(xiàn)錯(cuò)誤就紀(jì)錄以供參考
    Dim strDisplayName As String   
    strDisplayName = NTService1.DisplayName
    If Command = "-install" Then  ‘當(dāng)啟動(dòng)時(shí)帶上 –install的參數(shù)時(shí)
        NTService1.Interactive = True
        If NTService1.Install Then
            Call NTService1.SaveSetting("Parameters", "TimerInterval", "1000") ‘系統(tǒng)參數(shù)存儲(chǔ)
            MsgBox strDisplayName & " 安裝成功!"
        Else
            MsgBox strDisplayName & " 安裝失敗"
        End If
        End ‘終止安裝
    Else
        If Command = "-uninstall" Then ‘如果啟動(dòng)時(shí)帶上 撤除參數(shù)
           If NTService1.Uninstall Then
              MsgBox strDisplayName & " 撤除成功"
           Else
              MsgBox strDisplayName & " 撤除失敗"
           End If
           End ‘終止撤除
        Else
        End If
     End If
     ‘假若不是安裝或撤除操作,即為啟動(dòng)服務(wù)
     Timer1.Interval = CInt(NTService1.GetSetting("Parameters", "TimerInterval", "2000"))
     ‘使用Timer控件來(lái)模擬服務(wù)的線程特性
     NTService1.ControlsAccepted = svcCtrlPauseContinue ‘接受暫停、停止操作,意味著需要為此編碼
     NTService1.StartService ‘設(shè)置好參數(shù)后啟動(dòng)服務(wù)
Err_Load:
    Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description) ‘svcMessageError為NT服務(wù)控件的錯(cuò)誤值
    4、添加控制服務(wù)的代碼。
    盡管服務(wù)的連續(xù)線程等特性是依賴Timer實(shí)現(xiàn)的,但是服務(wù)的控制卻是有SCM接口向每一個(gè)服務(wù)發(fā)出的,表現(xiàn)在VB服務(wù)程序中為NT服務(wù)控件捕獲到相關(guān)的事件發(fā)生,我們就應(yīng)當(dāng)在這些事件中根據(jù)具體的情況響應(yīng),決定能不能、如何控制服務(wù)邏輯。當(dāng)然,具體的邏輯在Timer事件中表現(xiàn),但是通過(guò)改變NT服務(wù)控件和Timer控件均支持的全局變量,可以實(shí)現(xiàn)控制服務(wù)的邏輯實(shí)現(xiàn)。具體代碼演示:
Private Sub NTService1_Control(ByVal EventID As Long)
   On Error GoTo Err_Control
           ‘在此加入一些自己的處理邏輯,當(dāng)然也可以如本例一樣空缺
   Err_Control:
        Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] "              & Err.Description) ‘紀(jì)錄
End Sub
Private Sub NTService1_Pause(Success As Boolean)
  On Error GoTo Err_Pause
        Timer1.Enabled = False ‘禁止Timer事件,因此也停止了服務(wù)的發(fā)生
        Call NTService1.LogEvent(svcEventError, svcMessageError, "Service paused")
        Success = True  ‘返回給SCM命令發(fā)出者,表示服務(wù)成功停止
Err_Pause:
    Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description)
End Sub
Private Sub NTService1_Start(Success As Boolean)
  On Error GoTo Err_Start
    Success = True
    Timer1.Enabled = True ‘允許服務(wù)邏輯進(jìn)行
  Err_Start:
    Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description)
End Sub
Private Sub NTService1_Stop()
  On Error GoTo Err_Stop
     Unload Me ‘撤除Form,自然Timer也不存在,服務(wù)邏輯停止了

  Err_Stop:
 Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description)
End Sub
    5、編寫服務(wù)邏輯。
    具體就是在Timer事件中,根據(jù)約定寫一些服務(wù)細(xì)節(jié)。本例中就是發(fā)出Been,但是考慮到對(duì)SCM命令的響應(yīng),所以需要編碼為:
On Error GoTo Err_Timer
    Beep ‘此處即具體的服務(wù)細(xì)節(jié)
Err_Timer:
    Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description)
End Sub
    6、編譯安裝、測(cè)試
    如果以上沒有什么錯(cuò)誤的話,現(xiàn)在可以編譯程序了。假設(shè)我們得到的服務(wù)程序的文件名為:VBBeepSVC.exe,我們需要通過(guò)以下命令進(jìn)行安裝:
    d:/vbprog/>VBBeepSVC –install
    如果需要撤除已經(jīng)安裝的服務(wù),則:
    d:/vbprog/>VBBeepSVC –uninstall
    安裝完后,打開控制面板的“服務(wù)”(win2000中在“管理工具”),好了,看到其中的NT服務(wù)列表中包含我們加入的服務(wù),顯示為:“The VB NT SVC View”,我們可以類似啟動(dòng)其他任何服務(wù)一樣啟動(dòng)、停止、暫停此服務(wù)。啟動(dòng)服務(wù)時(shí),我們會(huì)聽到服務(wù)發(fā)出的討厭的beep聲音。我們的測(cè)試完成。

 

四、VB編寫服務(wù)的幾個(gè)說(shuō)明:
    1、首先聲明:VB編寫服務(wù)是一種嘗試,技術(shù)研究,并非提倡所有服務(wù)都要用VB寫才對(duì)頭。同理,也說(shuō)明了服務(wù)非VC寫不可。
    2、VB寫的服務(wù)僅適合win32服務(wù),不適合NT底層服務(wù)。
    3、VB的優(yōu)勢(shì)在ActiveX控件,NT服務(wù)中我們可以使用絕大多數(shù)控件來(lái)完成我們的服務(wù)邏輯,譬如涉及數(shù)據(jù)庫(kù)操作,我們可以使用ADO組件,這方面,同VC相比,VB具有天然的優(yōu)勢(shì)。
    4、做好服務(wù)內(nèi)部的錯(cuò)誤事件記載,只有用好這一點(diǎn),才能夠真正符合服務(wù)編寫規(guī)范,也方便我們的除錯(cuò)。
    5、最后一點(diǎn),本文僅供參考,如有錯(cuò)誤以及錯(cuò)誤引起的后果,本人概不負(fù)責(zé).


該文章在 2013/11/11 21:57:37 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved