VC++ 创建Windows服务
? ? 我在開(kāi)發(fā)的時(shí)候用到了DLL里面的函數(shù),開(kāi)始的時(shí)候采用的靜態(tài)導(dǎo)入的方法,但是發(fā)現(xiàn)服務(wù)開(kāi)機(jī)啟動(dòng)以后就死掉了,這里不是DLL路徑的問(wèn)題。
?? 沒(méi)辦法,自己只得用動(dòng)態(tài)導(dǎo)入的方法,還好,服務(wù)自動(dòng)開(kāi)機(jī)運(yùn)行了,還算正常吧。
?? 小提示:如果需要彈出MessageBox消息,比如讓服務(wù)可以與桌面進(jìn)行交互。? 這個(gè)在服務(wù)里面可以設(shè)置。
???? 當(dāng)然,我這里的初始化參數(shù)已經(jīng)設(shè)置好了,在DOS命令里面安裝完成后,你會(huì)發(fā)現(xiàn),那個(gè)框,我已經(jīng)替你選上了。
???
???? //重要說(shuō)明,服務(wù)最好不要直接編譯執(zhí)行,雖然是exe,最好的方式是安裝,?
???????? ?安裝命令??? DOS? 下:?? ServiceName.exe???? /install
????????? 卸載命令?? DOS下 :ServiceName.exe??????/uninstall????
???? ??直接運(yùn)行exe不僅會(huì)報(bào)錯(cuò),還會(huì)導(dǎo)致服務(wù)開(kāi)機(jī)不能自動(dòng)運(yùn)行。
???? 大多的時(shí)候,你直接運(yùn)行exe都會(huì)報(bào)1063錯(cuò)誤,就是因?yàn)槟惆逊?wù)以控制臺(tái)的方式運(yùn)行了。?
// CreateService.cpp : 定義應(yīng)用程序的入口點(diǎn)。 //#include "stdafx.h" #include <windows.h> #include <stdio.h> #include "CreateService.h"//定義全局函數(shù)變量 void Init(); BOOL IsInstalled(); BOOL Install(); BOOL Uninstall(); void LogEvent(LPCTSTR pszFormat, ...); void WINAPI ServiceMain(); void WINAPI ServiceStrl(DWORD dwOpcode); TCHAR szServiceName[] = _T("WatchDog"); BOOL bInstall; SERVICE_STATUS_HANDLE hServiceStatus; SERVICE_STATUS status; DWORD dwThreadID; int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow) {Init(); dwThreadID = ::GetCurrentThreadId(); SERVICE_TABLE_ENTRY st[] = { { szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; if (stricmp(lpCmdLine, "/install") == 0) { Install(); } else if (stricmp((LPCTSTR)lpCmdLine, "/uninstall") == 0) { Uninstall(); } else {if (!::StartServiceCtrlDispatcher(st)) { LogEvent(_T("Register Service Main Function Error!")); } } return 0; }//初始化 void Init() { hServiceStatus = NULL; status.dwServiceType = SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS; status.dwCurrentState = SERVICE_START_PENDING; status.dwControlsAccepted = SERVICE_ACCEPT_STOP; status.dwWin32ExitCode = 0; status.dwServiceSpecificExitCode = 0; status.dwCheckPoint = 0; status.dwWaitHint = 0; } //服務(wù)主函數(shù),這在里進(jìn)行控制對(duì)服務(wù)控制的注冊(cè) void WINAPI ServiceMain() {status.dwCurrentState = SERVICE_START_PENDING; status.dwControlsAccepted = SERVICE_ACCEPT_STOP; //注冊(cè)服務(wù)控制 hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl); if (hServiceStatus == NULL) { LogEvent(_T("Handler not installed")); return; } SetServiceStatus(hServiceStatus, &status); status.dwWin32ExitCode = S_OK; status.dwCheckPoint = 0; status.dwWaitHint = 0; status.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hServiceStatus, &status); //模擬服務(wù)的運(yùn)行。應(yīng)用時(shí)將主要任務(wù)放于此即可 //可在此寫(xiě)上服務(wù)需要執(zhí)行的代碼,一般為死循環(huán) while(1) { FILE *p;p = fopen("c:\\log.txt","ab+");SYSTEMTIME st;GetSystemTime(&st);char time[100] = {0};_sntprintf(time,100,"%4d-%02d-%02d %02d:%02d:%02d\r\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);fwrite(time,strlen(time),1,p);fclose(p);Sleep(1000);} status.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hServiceStatus, &status); }//Description: 服務(wù)控制主函數(shù),這里實(shí)現(xiàn)對(duì)服務(wù)的控制, // 當(dāng)在服務(wù)管理器上停止或其它操作時(shí),將會(huì)運(yùn)行此處代碼 void WINAPI ServiceStrl(DWORD dwOpcode) { switch (dwOpcode) { case SERVICE_CONTROL_STOP: status.dwCheckPoint = 1; status.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus(hServiceStatus, &status); Sleep(500);status.dwCheckPoint = 0; status.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hServiceStatus, &status); PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0); break; case SERVICE_CONTROL_PAUSE: break; case SERVICE_CONTROL_CONTINUE: break; case SERVICE_CONTROL_INTERROGATE: break; case SERVICE_CONTROL_SHUTDOWN:exit(0);break; default: LogEvent(_T("Bad service request")); } } //判斷服務(wù)是否已經(jīng)被安裝 BOOL IsInstalled() { BOOL bResult = FALSE; //打開(kāi)服務(wù)控制管理器 SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM != NULL) { //打開(kāi)服務(wù) SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG); if (hService != NULL) { bResult = TRUE; ::CloseServiceHandle(hService); } ::CloseServiceHandle(hSCM); } return bResult; } //安裝服務(wù)函數(shù) BOOL Install() { //檢測(cè)是否安裝過(guò)if (IsInstalled()) return TRUE; //打開(kāi)服務(wù)控制管理器 SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM == NULL) { MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK); return FALSE; } //獲取程序目錄TCHAR szFilePath[MAX_PATH]; ::GetModuleFileName(NULL, szFilePath, MAX_PATH); //創(chuàng)建服務(wù) SC_HANDLE hService = ::CreateService(hSCM, szServiceName, szServiceName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,SERVICE_AUTO_START , SERVICE_ERROR_NORMAL, szFilePath, NULL, NULL, _T(""), NULL, NULL); //檢測(cè)創(chuàng)建是否成功if (hService == NULL) { ::CloseServiceHandle(hSCM); MessageBox(NULL, _T("Couldn't create service"), szServiceName, MB_OK); return FALSE; }//釋放資源::CloseServiceHandle(hService); ::CloseServiceHandle(hSCM); return TRUE; } //刪除服務(wù)函數(shù) BOOL Uninstall() { //檢測(cè)是否安裝過(guò)if (!IsInstalled()) return TRUE; //打開(kāi)服務(wù)控制管理器SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM == NULL) { MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK); return FALSE; } //打開(kāi)具體服務(wù)SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);if (hService == NULL) { ::CloseServiceHandle(hSCM); MessageBox(NULL, _T("Couldn't open service"), szServiceName, MB_OK); return FALSE; }//先停止服務(wù)SERVICE_STATUS status; ::ControlService(hService, SERVICE_CONTROL_STOP, &status); //刪除服務(wù) BOOL bDelete = ::DeleteService(hService); ::CloseServiceHandle(hService); ::CloseServiceHandle(hSCM); if (bDelete) return TRUE; LogEvent(_T("Service could not be deleted")); return FALSE; } //記錄服務(wù)事件 void LogEvent(LPCTSTR pFormat, ...) { TCHAR chMsg[256]; HANDLE hEventSource; LPTSTR lpszStrings[1]; va_list pArg; va_start(pArg, pFormat); _vstprintf(chMsg, pFormat, pArg); va_end(pArg); lpszStrings[0] = chMsg; hEventSource = RegisterEventSource(NULL, szServiceName); if (hEventSource != NULL) { ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL); DeregisterEventSource(hEventSource); } }
總結(jié)
以上是生活随笔為你收集整理的VC++ 创建Windows服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Instsrv.exe可以给系统安装和删
- 下一篇: s3c2440移植MQTT