一個簡單的windows服務注冊例子,練手之作。如有不足之處請指出,O(∩_∩)O謝謝。
如有需要,可以直接沿用我的代碼增加程序主邏輯
程序安裝后在重啟后會自啟動,並Copy 到System32 目錄。
希望可以認識多一點熱愛編程的朋友
1 // ExampleService.cpp : 定義控制台應用程序的入口點。 2 // 3 4 #include "stdafx.h" 5 #include <Windows.h> 6 7 SERVICE_STATUS_HANDLE ssh=NULL; // 全局句柄,保存服務控制請求的句柄 8 SERVICE_STATUS ss = {0}; //保存服務信息的結構 9 void PrintError(wchar_t *err) //打印錯誤信息到控制台 10 { 11 printf("%s ErrorCode : %d\r\n",err,GetLastError()); 12 } 13 14 BOOL InstallService() //安裝服務 15 { 16 wchar_t DirBuf[1024]={0},SysDir[1024]={0}; 17 GetCurrentDirectory(1024,DirBuf); 18 GetModuleFileName(NULL,DirBuf,sizeof(DirBuf)); 19 GetSystemDirectory(SysDir,sizeof(SysDir)); 20 wcscat_s(SysDir,L"\\ExampleService.exe"); 21 if(!CopyFile(DirBuf,SysDir,FALSE)) 22 { 23 PrintError(L"CopyFile Fail"); 24 return FALSE; 25 } 26 27 SC_HANDLE sch = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); 28 if(!sch) 29 { 30 PrintError(L"OpenSCManager Failed"); 31 return FALSE; 32 } 33 34 SC_HANDLE schNewSrv = CreateService(sch,L"ExampleService",L"SampleServiceApp",SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START, 35 SERVICE_ERROR_NORMAL,SysDir,NULL,NULL,NULL,NULL,NULL); 36 37 if(!schNewSrv) 38 { 39 PrintError(L"CreateService Failed"); 40 return FALSE; 41 } 42 43 SERVICE_DESCRIPTION sd; 44 sd.lpDescription = L"A Sample Service , Test Example"; 45 46 ChangeServiceConfig2(schNewSrv,SERVICE_CONFIG_DESCRIPTION,&sd); 47 CloseServiceHandle(schNewSrv); 48 CloseServiceHandle(sch); 49 50 printf("Install Service Success!"); 51 return TRUE; 52 } 53 54 BOOL UnInstallService() //卸載服務 55 { 56 SC_HANDLE scm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); 57 if(!scm) 58 { 59 PrintError(L"OpenSCManager Failed"); 60 return FALSE; 61 } 62 63 SC_HANDLE scml = OpenService(scm,L"ExampleService",SC_MANAGER_ALL_ACCESS); 64 if(!scml) 65 { 66 PrintError(L"OpenService Failed"); 67 return FALSE; 68 } 69 SERVICE_STATUS ss; 70 if(!QueryServiceStatus(scml,&ss)) 71 { 72 PrintError(L"QueryServiceStatus Failed"); 73 return FALSE; 74 } 75 if(ss.dwCurrentState != SERVICE_STOPPED) 76 { 77 if(!ControlService(scml,SERVICE_CONTROL_STOP,&ss) && ss.dwCurrentState !=SERVICE_CONTROL_STOP) 78 { 79 PrintError(L"ControlService Stop Failed"); 80 return FALSE; 81 } 82 } 83 if(!DeleteService(scml)) 84 { 85 PrintError(L"DeleteService Failed"); 86 return FALSE; 87 } 88 printf("Delete Service Success!"); 89 return TRUE; 90 } 91 92 void WINAPI ServiceCtrlHandler(DWORD dwOpcode) //服務控制函數 93 { 94 switch(dwOpcode) 95 { 96 case SERVICE_CONTROL_STOP: 97 ss.dwCurrentState = SERVICE_STOPPED; 98 break; 99 case SERVICE_CONTROL_PAUSE: 100 ss.dwCurrentState = SERVICE_PAUSED; 101 break; 102 case SERVICE_CONTROL_CONTINUE: 103 ss.dwCurrentState = SERVICE_CONTINUE_PENDING; 104 break; 105 case SERVICE_CONTROL_INTERROGATE: 106 break; 107 case SERVICE_CONTROL_SHUTDOWN: 108 break; 109 default: 110 PrintError(L"bad service request"); 111 } 112 SetServiceStatus(ssh,&ss); 113 } 114 //服務入口函數 115 VOID WINAPI ServiceMain( 116 DWORD dwArgc, // number of arguments 117 LPTSTR *lpszArgv // array of arguments 118 ) 119 { 120 ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS; 121 ss.dwCurrentState = SERVICE_START_PENDING; 122 ss.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; 123 ss.dwCheckPoint = 0; 124 ss.dwServiceSpecificExitCode = 0; 125 ss.dwWaitHint = 0; 126 ss.dwWin32ExitCode = 0; 127 128 ssh = RegisterServiceCtrlHandler(L"ExampleService",ServiceCtrlHandler); 129 130 if(!ssh) 131 { 132 PrintError(L"RegisterService Fail"); 133 return; 134 } 135 if(!SetServiceStatus(ssh,&ss)) 136 { 137 PrintError(L"SetServiceStatus 0x01 Fail"); 138 return; 139 } 140 141 ss.dwWin32ExitCode = S_OK; 142 ss.dwCheckPoint = 0; 143 ss.dwWaitHint = 0; 144 ss.dwCurrentState = SERVICE_RUNNING; 145 if(!SetServiceStatus(ssh,&ss)) 146 { 147 PrintError(L"SetServiceStatus 0x02 Fail"); 148 return; 149 } 150 //SC_HANDLE scm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); 151 //SC_HANDLE scml = OpenService(scm,L"ExampleService",SC_MANAGER_ALL_ACCESS); 152 //StartService(scml,0,NULL); 153 //CloseServiceHandle(scml); 154 //CloseServiceHandle(scm); 155 156 while(1) 157 { 158 //do something, 在此處執行程序主邏輯 159 } 160 161 } 162 163 void usage() //打印幫助信息 164 { 165 printf("[[-i Install],[-r UnInstall]]"); 166 } 167 168 int _tmain(int argc, _TCHAR* argv[]) //入口函數 169 { 170 if(argc == 2) 171 { 172 //if arguments has 2 173 wchar_t buf[10]={0}; 174 wcscpy_s(buf,argv[1]); 175 if(0 == wcscmp(buf,L"-i")) 176 { 177 if(!InstallService()) 178 { 179 PrintError(L"Install Service Failed"); 180 return -1; 181 } 182 } 183 else if(0 == wcscmp(buf,L"-r")) 184 { 185 if(!UnInstallService()) 186 return -1; 187 else 188 return 0; 189 } 190 } 191 else if(argc > 2) 192 { 193 usage(); 194 return -1; 195 } 196 197 198 SERVICE_TABLE_ENTRY srvEntry[] = { 199 {L"ExampleService",ServiceMain}, 200 {NULL,NULL} 201 }; 202 StartServiceCtrlDispatcher(srvEntry); 203 return 0; 204 }