資源簡介
本文共涉及3個工程:beep、install、uninstall。
1) beep工程用于新服務的實現(xiàn),工程中包含beep.cpp。編譯并生成beep.exe,將其拷貝至c:\目錄下,供安裝程序調用。當安裝完畢后,SCM也將調用beep.exe來執(zhí)行該服務。
2) install工程用于新服務的安裝,工程中包含install.cpp。編譯并生成install.exe,將其拷貝至:c:\目錄中,然后在Windows NT中單擊“開始”,再單擊“運行”,使用“運行”命令執(zhí)行帶3個參數(shù)的installl.exe程序。輸入以下命令行進行安裝:c:\install.exe BeepService "Beeper" c:\Beep.exe 。其中BeepService是供SCM內部使用的服務名,Beeper是顯示在控制面板的服務程序中的名稱,"c:\Beep.exe"是服務所在的可執(zhí)行文件的路徑。安裝完畢后,你可以在控制面板的服務程序中看到新增的服務Beeper,點擊右鍵選擇“屬性”,你就可以設置服務的啟動類型、服務的狀態(tài)和啟動參數(shù)。
3) uninstall工程用于新服務的卸載,工程中包含uninstall.cpp。編譯并生成uninstall.exe,將其拷貝至:c:\目錄中,然后在Windows NT中單擊“開始”,再單擊“運行”,使用“運行”命令執(zhí)行帶1個參數(shù)的uninstall.exe程序。輸入以下命令行進行卸載:c:\uninstall.exe BeepService。其中BeepService就是在安裝服務是生成的供SCM內部使用的服務名。

代碼片段和文件信息
#include??
#include??
#include??
#include??
//#include?“yewu.cpp“
//Download?by?http://www.codefans.net
#define?DEFAULT_BEEP_DELAY?3000?? //?定義蜂鳴的間隔時間值
char?*SERVICE_NAME?=?“BeepService“; //?定義服務的名稱
HANDLE?terminateEvent?=?NULL; //?定義用于控制ServiceMain執(zhí)行的事件句柄
SERVICE_STATUS_HANDLE?serviceStatusHandle; //?定義與SCM通訊的服務狀態(tài)句柄
int?beepDelay?=?DEFAULT_BEEP_DELAY; //?定義蜂鳴的間隔時間
BOOL?pauseService?=?FALSE; //?定義服務暫停的標志
BOOL?runningService?=?FALSE; //?定義服務運行的標志
HANDLE?threadHandle?=?0; //?定義實現(xiàn)服務功能的線程句柄
char?lpszMac[128];
VOID?SendStatusToSCM?(DWORD?dwCurrentStateDWORD?dwWin32ExitCode?
??DWORD?dwServiceSpecificExitCodeDWORD?dwCheckPointDWORD?dwWaitHint)
{
SERVICE_STATUS?serviceStatus;
? serviceStatus.dwServiceType?=?SERVICE_WIN32_OWN_PROCESS;? //設置服務運行在其自身的進程中
serviceStatus.dwCurrentState?=?dwCurrentState; //設置服務的當前狀態(tài)
? //?如果服務正在啟動,則不接收和處理控制通知事件,否則接收所有的控制通知事件
if?(dwCurrentState?==?SERVICE_START_PENDING)?
serviceStatus.dwControlsAccepted?=?0;
else?
serviceStatus.dwControlsAccepted?=?SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE?|SERVICE_ACCEPT_SHUTDOWN;
? /*?如果服務具有特定的出錯代碼,則設置serviceStatus?的dwWin32ExitCode屬性為
ERROR_SERVICE_SPECIFIC_ERROR,并設置serviceStatus的dwServiceSpecificExitCode屬性
為特定出錯代碼,以顯示特定的錯誤信息*/
if?(dwServiceSpecificExitCode?==?0)
{
serviceStatus.dwWin32ExitCode?=?dwWin32ExitCode;
serviceStatus.dwServiceSpecificExitCode?=0;
}
else
{
serviceStatus.dwWin32ExitCode?=?ERROR_SERVICE_SPECIFIC_ERROR;
serviceStatus.dwServiceSpecificExitCode?=dwServiceSpecificExitCode;?//設置服務的特定出錯代碼
}
? serviceStatus.dwCheckPoint?=?dwCheckPoint; //設置服務在啟動、關閉和運行操作中反映操作進度的值
serviceStatus.dwWaitHint?=?dwWaitHint; //設置服務在執(zhí)行啟動、關閉和運行操作時將持續(xù)的時間值
? SetServiceStatus?(serviceStatusHandle?&serviceStatus); //更新SCM中服務的狀態(tài)信息
}
DWORD?ServiceThread(LPDWORD?param)
{ //使用Sleep函數(shù)將while控制流程掛起,然后在指定的毫秒數(shù)后自動喚醒
while?(1)
{
//GetMacByCmd(lpszMac);
Beep(200200);???//進行蜂鳴
Sleep(beepDelay);?//將該線程掛起beepDelay中指定的毫秒數(shù)
}
return?0;
}
VOID?Handler?(DWORD?controlCode)?
{
switch(controlCode)
{ //?處理停止服務事件
case?SERVICE_CONTROL_STOP:
//通知SCM服務即將停止
SendStatusToSCM(SERVICE_STOP_PENDINGNO_ERROR?0?1?5000);
runningService=FALSE; ??//設置服務運行的標志
SetEvent(terminateEvent);?//設置終止事件句柄為活動狀態(tài),從而使ServiceMain函數(shù)得以繼續(xù)執(zhí)行
return;
? //?處理暫停服務事件
case?SERVICE_CONTROL_PAUSE:
if?(runningService?&&?!pauseService)
{
//?通知SCM服務即將暫停
SendStatusToSCM( SERVICE_PAUSE_PENDINGNO_ERROR?0?1?1000);
pauseService?=?TRUE; //設置服務暫停的標志
SuspendThread(threadHandle);?? ?? //掛起新服務的線程
SendStatusToSCM(SERVICE_PAUSED?NO_ERROR?0?0?0); ??? //通知SCM服務暫停
}
break;
? //?處理繼續(xù)服務事件
case?SERVICE_CONTROL_CONTINUE:
if?(runningService?&&?pauseService)
{
//?通知SCM服務即將繼續(xù)
SendStatusToSCM( SERVICE_CONTINUE_PENDINGNO_ERROR?0?1?1000);
pauseService=FALSE;
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2012-12-31?08:17??Service\
?????目錄???????????0??2012-12-31?08:17??Service\beep\
?????目錄???????????0??2012-12-31?08:17??Service\beep\Debug\
?????文件??????155737??2012-11-14?08:17??Service\beep\Debug\beep.exe
?????文件??????177124??2012-11-14?08:17??Service\beep\Debug\beep.ilk
?????文件???????17559??2012-11-14?08:17??Service\beep\Debug\beep.obj
?????文件?????3627624??2012-11-13?07:49??Service\beep\Debug\beep.pch
?????文件??????566272??2012-11-13?07:49??Service\beep\Debug\beep.pdb
?????文件??????369664??2012-11-14?08:17??Service\beep\Debug\vc60.idb
?????文件??????274432??2012-11-13?07:49??Service\beep\Debug\vc60.pdb
?????文件????????5831??2012-11-13?07:49??Service\beep\beep.cpp
?????文件????????4260??2000-11-07?11:14??Service\beep\beep.dsp
?????文件?????????531??2000-11-07?11:07??Service\beep\beep.dsw
?????文件???????50176??2012-11-14?08:17??Service\beep\beep.ncb
?????文件???????48640??2012-11-14?08:17??Service\beep\beep.opt
?????文件?????????734??2012-11-14?08:17??Service\beep\beep.plg
?????文件????????6533??2012-11-12?09:51??Service\beep\yewu.cpp
?????目錄???????????0??2012-12-31?08:17??Service\install\
?????目錄???????????0??2012-12-31?08:17??Service\install\Debug\
?????文件??????151647??2012-11-14?08:18??Service\install\Debug\install.exe
?????文件??????162896??2012-11-14?08:18??Service\install\Debug\install.ilk
?????文件???????11762??2012-11-14?08:18??Service\install\Debug\install.obj
?????文件?????3611192??2012-11-11?17:00??Service\install\Debug\install.pch
?????文件??????402432??2012-11-13?07:50??Service\install\Debug\install.pdb
?????文件??????148480??2012-11-14?08:18??Service\install\Debug\vc60.idb
?????文件???????86016??2012-11-12?11:42??Service\install\Debug\vc60.pdb
?????文件????????1067??2012-11-12?11:41??Service\install\install.cpp
?????文件????????4296??2000-11-07?11:15??Service\install\install.dsp
?????文件?????????537??2000-11-07?11:14??Service\install\install.dsw
?????文件???????41984??2012-11-14?08:19??Service\install\install.ncb
?????文件???????48640??2012-11-14?08:19??Service\install\install.opt
............此處省略17個文件信息
評論
共有 條評論