1銆佹簮浠g爜
//鏈嶅姟鍣ㄧ姸鎬佸垏鎹㈠搷搴斿嚱鏁?br />void WINAPI ServiceHandler(DWORD fdwControl)
{
FILE* log = NULL;
switch (fdwControl)
{
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
//add you quit code here
log = fopen("D:\\log.txt", "a+");
if (log)
{
fprintf(log, "ServiceHandler: %s\n", "service stop");
fclose(log);
}
break;
default:
return;
};
if (!SetServiceStatus(hServiceStatusHandle, &ServiceStatus))
{
DWORD nError = GetLastError();
}
}
//鑷畾涔夊伐浣滅嚎紼嬪洖璋冨嚱鏁幫紝鏈嶅姟鍣ㄥ惎鍔ㄥ墠錛岃皟璇曢檮鍔犺繘紼?>閫夋嫨鏈嶅姟榪涚▼鍚嶇О錛屽茍鍦ㄦ鍑芥暟涓姞鏂偣
void MyFunction()
{
FILE* fp = fopen("D:\\log.txt", "a+");
if (fp)
{
fputs("\n", fp);
fputs("work thread start!", fp);
fputs("\n", fp);
fclose(fp);
}
while(true)
{
Sleep(1);
}
}
//鍚姩鏈嶅姟鍝嶅簲鍑芥暟
void WINAPI service_main(int argc, char** argv)
{
ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
hServiceStatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, ServiceHandler);
if (hServiceStatusHandle == 0)
{
DWORD nError = GetLastError();
}
std::cout << "my service start!" << std::endl;
//add your init code here
FILE* log = fopen("D:\\log.txt", "a+");
for (int i = 0; i < argc; ++i)
{
fprintf(log, "service_main: %s\n", argv[i]);
}
fclose(log);
//add your service thread here
std::thread wnd_thread(MyFunction);
wnd_thread.detach();
// Initialization complete - report running status
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 9000;
if (!SetServiceStatus(hServiceStatusHandle, &ServiceStatus))
{
DWORD nError = GetLastError();
}
}
int main(int argc, const char* argv[]){
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = (LPSTR)SERVICE_NAME;
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)service_main;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
// 鍚姩鏈嶅姟鐨勬帶鍒跺垎媧炬満綰跨▼
StartServiceCtrlDispatcher(ServiceTable);
return 0;
}
2銆佸垱寤烘湇鍔?br />鎵撳紑鎺у埗鍙幫紝杈撳叆鍛戒護錛?br />
sc create ServiceTest binPath= "緙栬瘧鐢熸垚鐨勫彲鎵ц鏂囦歡緇濆璺緞鍙婃枃浠跺悕"
渚嬪錛屼笂闈㈢ず渚嬬▼搴忕紪璇戣緭鍑鴻礬寰勫強鐢熸垚鍙墽琛屾枃浠跺悕涓猴細(xì)
D:\Test\ServiceTest\Debug\ServiceTest.exe
鍒欙紝鎺у埗鍙拌緭鍏ュ懡浠や負(fù)錛?br />
sc create ServiceTest binPath= "D:\Test\ServiceTest\Debug\ServiceTest.exe"
3銆佸惎鍔ㄦ湇鍔?br />錛堝鏋滈渶瑕佽皟璇曠殑璇濓紝姝ゆ椂闄勫姞璋冭瘯榪涚▼ServiceTest錛屽茍鍦ㄨ嚜瀹氫箟宸ヤ綔綰跨▼鍥炶皟鍑芥暟涓姞鏂偣錛?br />鎺у埗鍙頒腑杈撳叆鍛戒護錛?br />sc start ServiceTest
4銆佸叧闂湇鍔?br />sc stop ServiceTest
5銆佸垹闄ゆ湇鍔?br />sc delete ServiceTest
O浜嗭紒

]]>