WINDOWS服务程序笔记
来源:互联网 发布:淘宝信用卡开通条件 编辑:程序博客网 时间:2024/06/01 08:55
参考文章:http://blog.csdn.net/yuchongjike/article/details/6137823
http://www.360doc.com/content/12/0828/09/10473672_232744894.shtml
// ServiceUSB.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <windows.h> #include <stdio.h> #include <time.h>#define LOG_ERR 0#define LOG_INFO 1#define LOG_WARNING 2 #define LOG_FILE_NAME "C:\\lclog\\log.txt" #define APPNAME "USBSrv" //应用程序名 #define SERVICENAME "USBSrv" //服务名称 #define SERVICEDESC "USB check service" //服务描述 void InstallService(); //安装服务 void UnInstallService(); //删除服务 void WINAPI ServiceMain_DNetTime(DWORD dwArgc,LPTSTR *lpArgv); //服务处理主函数,注册服务 void WINAPI ServiceCtrlHandle(DWORD dwCtrlCode); //服务控制,注册服务时用 void LogEvent(WORD wType,LPCTSTR lpszText); //事件记录 DWORD WINAPI Service(LPVOID lpvThread); //服务功能函数 写想要做的事 int writelog(int nLogLevel,char *pcFormat,...); LPCTSTR GetErrMsg(DWORD dwCode); BOOL ServiceControl(DWORD dwControlID); BOOL ServiceStart(); SERVICE_STATUS g_ServiceStatus; //记录服务状态 SERVICE_STATUS_HANDLE g_hServiceStatus; //注册服务时返回值,服务控制时用 BOOL g_bService; //一个标记,退出执行体用.可以换成事件 int main(int argc, char* argv[]){writelog(LOG_INFO,"main");if(argc == 2 && (*(argv[1]) == '-' || *(argv[1]) == '/')) { if(stricmp(argv[1]+1,"Install") == 0) { InstallService(); } else if(stricmp(argv[1]+1,"UnInstall") == 0) { UnInstallService(); } else if(stricmp(argv[1]+1,"Start") == 0) { ServiceStart(); } else { goto Dispatch; //如果这里不跳转,在启动时会提示1053,无法启动;也可以把参数这一节另外写一个程序 } return 0; } Dispatch: SERVICE_TABLE_ENTRY ste[] = { {SERVICENAME,ServiceMain_DNetTime}, //服务名,服务处理主函数 {NULL,NULL} //最后必须有一个NULL }; if(!StartServiceCtrlDispatcher(ste)) //服务事件分派 { LogEvent(EVENTLOG_ERROR_TYPE,GetErrMsg(GetLastError())); return -1; } return 0; }void LogEvent(WORD wType,LPCTSTR lpszText) { writelog(LOG_INFO,"LogEvent"); HANDLE hLogSouce = RegisterEventSource(NULL,APPNAME); if(hLogSouce == NULL) { return; } ReportEvent(hLogSouce,wType,0,GetLastError(),NULL,1,0,&lpszText,NULL); DeregisterEventSource(hLogSouce); } LPCTSTR GetErrMsg(DWORD dwCode) { LPVOID lpBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0,dwCode,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPSTR)&lpBuf,0,NULL); return (LPCTSTR)lpBuf; } BOOL ServiceStart() {
writelog(LOG_INFO,"ServiceStart"); SC_HANDLE hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if(NULL == hSCM) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); return false; } SC_HANDLE hService = OpenService(hSCM,TEXT(SERVICENAME),SERVICE_ALL_ACCESS); if(NULL == hService) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); CloseServiceHandle(hSCM); return false; } if(!StartService(hService,0,NULL)) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); return false; } LogEvent(EVENTLOG_INFORMATION_TYPE,TEXT("Service Started")); return true; } BOOL ServiceControl(DWORD dwControlID) { writelog(LOG_INFO,"ServiceControl"); SC_HANDLE hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if(NULL == hSCM) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); return false; } SC_HANDLE hService = OpenService(hSCM,TEXT(SERVICENAME),SERVICE_STOP | SERVICE_RUNNING | SERVICE_PAUSED); if(NULL == hService) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); CloseServiceHandle(hSCM); return false; } if(!ControlService(hService,dwControlID,&g_ServiceStatus)) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); CloseServiceHandle(hService); CloseServiceHandle(hSCM); return false; } CloseServiceHandle(hService); CloseServiceHandle(hSCM); return true; }void WINAPI ServiceCtrlHandle(DWORD dwCtrlCode) { writelog(LOG_INFO,"ServiceCtrlHandle"); switch(dwCtrlCode) { case SERVICE_CONTROL_CONTINUE: g_ServiceStatus.dwCurrentState = SERVICE_RUNNING; break; case SERVICE_CONTROL_PAUSE: g_ServiceStatus.dwCurrentState = SERVICE_PAUSED; break; case SERVICE_CONTROL_STOP: g_ServiceStatus.dwCheckPoint = 0; g_ServiceStatus.dwWaitHint = 0; g_ServiceStatus.dwWin32ExitCode = 0; g_bService = false; g_ServiceStatus.dwCurrentState = SERVICE_STOPPED; if(SetServiceStatus(g_hServiceStatus, &g_ServiceStatus) == 0) { //SetServiceStatus error! } break; default: break; } ServiceControl(dwCtrlCode); //不要这句也可以 if(!SetServiceStatus(g_hServiceStatus,&g_ServiceStatus)) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); } }void WINAPI ServiceMain_DNetTime(DWORD dwArgc,LPTSTR *lpArgv) { g_ServiceStatus.dwCheckPoint = 0; g_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; g_ServiceStatus.dwServiceSpecificExitCode = 0; g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; g_ServiceStatus.dwWaitHint = 0; g_ServiceStatus.dwWin32ExitCode = 0; //注册服务 g_hServiceStatus = RegisterServiceCtrlHandler(TEXT(SERVICENAME),ServiceCtrlHandle); if(g_hServiceStatus == 0) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); return; } //g_ServiceStatus.dwWaitHint = 3000; //SetServiceStatus(g_hServiceStatus,&g_ServiceStatus); g_ServiceStatus.dwWaitHint = 0; g_ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(g_hServiceStatus,&g_ServiceStatus); g_bService = true; //if(!ServiceStart()) return; //服务实现
if(bService)
{ HANDLE hThread = CreateThread(NULL, 0, Service, NULL, 0, NULL); if(hThread == NULL) { //CreateThread error! return; } CloseHandle(hThread);} } void UnInstallService() { writelog(LOG_INFO,"UnInstallService"); SC_HANDLE hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if(NULL == hSCM) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); return; } SC_HANDLE hService = OpenService(hSCM,TEXT(SERVICENAME),SERVICE_STOP | DELETE); if(NULL == hService) { printf("Open service error!/r/n"); printf(TEXT(GetErrMsg(GetLastError()))); LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); CloseServiceHandle(hSCM); return; } QueryServiceStatus(hService,&g_ServiceStatus); if(g_ServiceStatus.dwCurrentState == SERVICE_RUNNING) { if(!ControlService(hService,SERVICE_CONTROL_STOP,&g_ServiceStatus)) { printf("control service error!/r/n"); printf(TEXT(GetErrMsg(GetLastError()))); LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); CloseServiceHandle(hService); CloseServiceHandle(hSCM); return; } } if(!DeleteService(hService)) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); } else { printf("Uninstall successed!/r/n"); } CloseServiceHandle(hService); CloseServiceHandle(hSCM); } void InstallService() { writelog(LOG_INFO,"InstallService"); char szPath[255] = {0}; GetModuleFileName(NULL,szPath,255); SC_HANDLE hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if(hSCM == NULL) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); return; } SC_HANDLE hService = CreateService(hSCM,TEXT(SERVICENAME),TEXT(SERVICENAME), SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,szPath, NULL,NULL,NULL,NULL,NULL); if(hService == NULL) { LogEvent(EVENTLOG_ERROR_TYPE,TEXT(GetErrMsg(GetLastError()))); CloseServiceHandle(hSCM); return; } SERVICE_DESCRIPTION sd; sd.lpDescription = SERVICEDESC; //添加服务描述信息 ::ChangeServiceConfig2(hService,SERVICE_CONFIG_DESCRIPTION,&sd); LogEvent(EVENTLOG_INFORMATION_TYPE,TEXT("Install service successed")); CloseServiceHandle(hService); CloseServiceHandle(hSCM); printf("Install service successed!/r/n"); }int writelog(int nLogLevel,char *pcFormat,...){ char szBuf[16]; char szRename[256]; int iRc=0; memset(szBuf,0,sizeof(szBuf)); memset(szRename,0,sizeof(szRename)); time_t now; now=time(NULL); struct tm *tp; tp =localtime(&now); //int iFileSize =0; FILE *fp =NULL; fp=fopen(LOG_FILE_NAME,"a+"); if(fp==NULL){//writelog(LOG_ERR,"open the file %s failed\n",FILE_NAME);//MessageBox("open the file failed");return 1; } //iFileSize= get_file_size(LOG_FILE_NAME);if (nLogLevel ==LOG_INFO ) {strcpy(szBuf,"<INFO:");}else if(nLogLevel==LOG_WARNING){strcpy(szBuf,"<WARN:");}else if(nLogLevel==LOG_ERR){strcpy(szBuf,"<ERR: ");}else{strcpy(szBuf,"~~~~~");} fprintf(fp,"%s %02d:%02d:%02d>",szBuf,tp->tm_hour,tp->tm_min,tp->tm_sec); va_list argptr; va_start(argptr,pcFormat);vfprintf(fp,pcFormat,argptr);va_end(argptr); fclose(fp); fp=NULL; return 0;} //服务线程函数DWORD WINAPI Service(LPVOID lpvThread){ writelog(LOG_INFO,"Service"); //实现函数功能的地方。 return 1;}
遇到问题:停止服务时,总会提示1053的错误,但服务还是会停止
解决途径:对于“错误1053:服务没有及时响应启动或控制请求”,我郁闷了一下午,后来在调试发现是单线程泵式等待,导致服务在60秒没有响应,所以 Windows 服务控制器会将此服务标记为“超时”。通过设置dwWaitHint 也没有解决问题,根本的解决办法是设置成多线程。
ServiceMain_DNetTime函数中添加:
HANDLE hThread = CreateThread(NULL, 0, Service, NULL, 0, NULL); if(hThread == NULL) { //CreateThread error! return; } CloseHandle(hThread);}
可以成功的解决关闭服务出错的问题。
使用方法:
在控制台下输入 ServiceUSB /Install 或者 ServiceUSB -Install
开启服务:ServiceUSB /Start
卸载服务:ServiceUSB /UnInstall
可以通过在控制台输入:services.msc 查看服务
- WINDOWS服务程序笔记
- Windows服务程序
- Windows服务程序
- 制作windows服务程序
- 制作windows服务程序
- Windows服务程序
- windows 服务程序示例
- 删除Windows服务程序
- c# windows服务程序
- WINDOWS服务程序 安装
- 编写 Windows 服务程序
- windows服务程序初探
- Windows 服务程序
- Windows 服务程序详解
- windows 服务程序学习心得
- windows 服务程序编写
- Windows服务程序编写
- Windows服务程序
- [控件]ExpandableListActivity
- 2012移动开发者大会上海站即将召开
- 查看指定用户获得的权限
- setjmp与longjmp
- 利用jquery解决下拉菜单被Div遮挡问题
- WINDOWS服务程序笔记
- 配置标准ActiveMQ组件--连接到ActiveMQ
- Linux多线程编程简例6个
- libjpeg样例
- Oracle用户、权限、角色管理
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- sql去重统计
- 使用纯C++实现SQL Server2005 数据库读写操作详细步骤
- ZOJ 3471 状态压缩DP