如何把一个程序注册成系统服务呢? 在c++中,我现在想把一个程序(比如:写磁盘)的程序作成一个系统服务,该如何实现呢?请给出相关资料和信息,不胜感激! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码太长了,我有一个这样的例子,如果有兴趣话给我发邮件[email protected] //注册并启动/终止服务BOOL RegisterServer(LPCTSTR lpServiceName,LPCTSTR lpDisplayName,LPCTSTR lpBinaryPathName){ SC_HANDLE hSCManager = OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE); if(hSCManager == NULL) { return FALSE; } if(CreateService(hSCManager,lpServiceName,lpDisplayName, SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,lpBinaryPathName,NULL,NULL,NULL,NULL,NULL)) { printf("RegisterServer...\r\n"); CloseServiceHandle(hSCManager); return TRUE; } else { printf("RegisterServer Error Code = %d\r\n",GetLastError()); CloseServiceHandle(hSCManager); return FALSE; }}BOOL ExecuteService(LPCTSTR lpServiceName){ SC_HANDLE hSCManager,hService; hSCManager = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS); if(hSCManager == NULL) { return FALSE; } hService = OpenService(hSCManager,lpServiceName,SERVICE_ALL_ACCESS); if(hService == NULL) { CloseServiceHandle(hSCManager); return FALSE; } if(StartService(hService,0,NULL)) { printf("StartService...\r\n"); CloseServiceHandle(hService); CloseServiceHandle(hSCManager); return TRUE; } else { printf("StartService Error Code = %d\r\n",GetLastError()); CloseServiceHandle(hService); CloseServiceHandle(hSCManager); return FALSE; }}BOOL TerminateService(LPCTSTR lpServiceName){ SC_HANDLE hSCManager,hService; hSCManager = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS); if(hSCManager == NULL) { return FALSE; } hService = OpenService(hSCManager,lpServiceName,SERVICE_ALL_ACCESS); if(hService == NULL) { CloseServiceHandle(hSCManager); return FALSE; } if(StartService(hService,0,NULL)) { SERVICE_STATUS ServerStatus; ControlService(hService,SERVICE_CONTROL_STOP,&ServerStatus); printf("TerminateService...\r\n"); CloseServiceHandle(hService); CloseServiceHandle(hSCManager); return TRUE; } else { printf("TerminateService Error Code = %d\r\n",GetLastError()); CloseServiceHandle(hService); CloseServiceHandle(hSCManager); return FALSE; }} //要做成服务的EXE必须这样写#include <stdio.h>#include <windows.h>#include <winsvc.h>#define SERVERNAME "EnochServer"void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);void WINAPI ServiceControl(DWORD nControlCode);BOOL ExecuteService();void TerminateService();DWORD WINAPI ServiceProc(LPVOID lpParameter);BOOL UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,DWORD dwWaitHint);SERVICE_STATUS_HANDLE hServiceStatus; DWORD ServiceCurrentStatus;HANDLE hServiceThread;BOOL bServiceRunning;HANDLE hServiceEvent;void main(int argc, char* argv[]){ SERVICE_TABLE_ENTRY ServiceTable[] = { {SERVERNAME,(LPSERVICE_MAIN_FUNCTION)ServiceMain}, {NULL,NULL} }; if(!StartServiceCtrlDispatcher(ServiceTable)) { printf("RegisterServer First"); }}void WINAPI ServiceMain(DWORD argc, LPTSTR *argv){ hServiceStatus = RegisterServiceCtrlHandler(SERVERNAME,(LPHANDLER_FUNCTION)ServiceControl); if(!hServiceStatus || !UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,1,3000)) { return; } hServiceEvent = CreateEvent(0,TRUE,FALSE,0); if(!hServiceEvent || !UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,2,1000)) { return; } if(!ExecuteService()) { return; } ServiceCurrentStatus = SERVICE_RUNNING; if(!UpdateServiceStatus(SERVICE_RUNNING,NO_ERROR,0,0,0)) { return; } WaitForSingleObject(hServiceEvent,INFINITE); CloseHandle(hServiceEvent);}void WINAPI ServiceControl(DWORD dwControlCode){ switch(dwControlCode) { case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: ServiceCurrentStatus = SERVICE_STOP_PENDING; UpdateServiceStatus(SERVICE_STOP_PENDING,NO_ERROR,0,1,3000); TerminateService(); return; default: break; } UpdateServiceStatus(ServiceCurrentStatus,NO_ERROR,0,0,0);}BOOL ExecuteService(){ DWORD dwThreadID; hServiceThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ServiceProc,0,0,&dwThreadID); if(hServiceThread != NULL) { bServiceRunning = TRUE; return TRUE; } else { return FALSE; }}void TerminateService(){ bServiceRunning = FALSE; SetEvent(hServiceEvent); UpdateServiceStatus(SERVICE_STOPPED,NO_ERROR,0,0,0);}DWORD WINAPI ServiceProc(LPVOID lpParameter)//在这个函数里面添加你想要的操作{ while(bServiceRunning) { Beep(450,150); Sleep(4000); } return 0;}BOOL UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,DWORD dwWaitHint){ SERVICE_STATUS ServiceStatus; ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; ServiceStatus.dwCurrentState = dwCurrentState; if(dwCurrentState == SERVICE_START_PENDING) { ServiceStatus.dwControlsAccepted = 0; } else { ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; } if(dwServiceSpecificExitCode == 0) { ServiceStatus.dwWin32ExitCode = dwWin32ExitCode; } else { ServiceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; } ServiceStatus.dwServiceSpecificExitCode = dwServiceSpecificExitCode; ServiceStatus.dwCheckPoint = dwCheckPoint; ServiceStatus.dwWaitHint = dwWaitHint; if(!SetServiceStatus(hServiceStatus,&ServiceStatus)) { TerminateService(); return FALSE; } return TRUE;} 匿名管道程序,调通给分! 帮解读一个语法 vc单文档初始化时全屏 请教CTabCtrl添加两个Dialog,如何从dialog1获取dialog2的地址? 继承于CButton类的点击消息问题 MFC中SetTimer不起作用是怎么回事?! 有个窗口刷新问题困扰了我好几天,请大虾赐教 怎么获得系统新开一个窗口的通知,是用钩子吗? 关于用ADO编程过程中对Access数据库进行修改的问题 vs2010 MFC 如何操纵DBF文件,获取数据 Oracle连接问题 如何实现像IE窗口的移动?
BOOL RegisterServer(LPCTSTR lpServiceName,LPCTSTR lpDisplayName,LPCTSTR lpBinaryPathName)
{
SC_HANDLE hSCManager = OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE);
if(hSCManager == NULL)
{
return FALSE;
} if(CreateService(hSCManager,lpServiceName,lpDisplayName,
SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,lpBinaryPathName,NULL,NULL,NULL,NULL,NULL))
{
printf("RegisterServer...\r\n"); CloseServiceHandle(hSCManager);
return TRUE;
}
else
{
printf("RegisterServer Error Code = %d\r\n",GetLastError()); CloseServiceHandle(hSCManager);
return FALSE;
}
}BOOL ExecuteService(LPCTSTR lpServiceName)
{
SC_HANDLE hSCManager,hService;
hSCManager = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS);
if(hSCManager == NULL)
{
return FALSE;
} hService = OpenService(hSCManager,lpServiceName,SERVICE_ALL_ACCESS);
if(hService == NULL)
{
CloseServiceHandle(hSCManager);
return FALSE;
} if(StartService(hService,0,NULL))
{
printf("StartService...\r\n"); CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return TRUE;
}
else
{
printf("StartService Error Code = %d\r\n",GetLastError()); CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return FALSE;
}
}BOOL TerminateService(LPCTSTR lpServiceName)
{
SC_HANDLE hSCManager,hService;
hSCManager = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS);
if(hSCManager == NULL)
{
return FALSE;
} hService = OpenService(hSCManager,lpServiceName,SERVICE_ALL_ACCESS);
if(hService == NULL)
{
CloseServiceHandle(hSCManager);
return FALSE;
} if(StartService(hService,0,NULL))
{
SERVICE_STATUS ServerStatus;
ControlService(hService,SERVICE_CONTROL_STOP,&ServerStatus); printf("TerminateService...\r\n"); CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return TRUE;
}
else
{
printf("TerminateService Error Code = %d\r\n",GetLastError()); CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return FALSE;
}
}
#include <windows.h>
#include <winsvc.h>#define SERVERNAME "EnochServer"void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceControl(DWORD nControlCode);
BOOL ExecuteService();
void TerminateService();
DWORD WINAPI ServiceProc(LPVOID lpParameter);
BOOL UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,DWORD dwWaitHint);SERVICE_STATUS_HANDLE hServiceStatus;
DWORD ServiceCurrentStatus;
HANDLE hServiceThread;
BOOL bServiceRunning;
HANDLE hServiceEvent;void main(int argc, char* argv[])
{
SERVICE_TABLE_ENTRY ServiceTable[] =
{
{SERVERNAME,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
{NULL,NULL}
}; if(!StartServiceCtrlDispatcher(ServiceTable))
{
printf("RegisterServer First");
}
}void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
hServiceStatus = RegisterServiceCtrlHandler(SERVERNAME,(LPHANDLER_FUNCTION)ServiceControl);
if(!hServiceStatus || !UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,1,3000))
{
return;
} hServiceEvent = CreateEvent(0,TRUE,FALSE,0);
if(!hServiceEvent || !UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,2,1000))
{
return;
} if(!ExecuteService())
{
return;
} ServiceCurrentStatus = SERVICE_RUNNING; if(!UpdateServiceStatus(SERVICE_RUNNING,NO_ERROR,0,0,0))
{
return;
} WaitForSingleObject(hServiceEvent,INFINITE);
CloseHandle(hServiceEvent);
}void WINAPI ServiceControl(DWORD dwControlCode)
{
switch(dwControlCode)
{
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
ServiceCurrentStatus = SERVICE_STOP_PENDING;
UpdateServiceStatus(SERVICE_STOP_PENDING,NO_ERROR,0,1,3000);
TerminateService();
return;
default:
break;
}
UpdateServiceStatus(ServiceCurrentStatus,NO_ERROR,0,0,0);
}BOOL ExecuteService()
{
DWORD dwThreadID;
hServiceThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ServiceProc,0,0,&dwThreadID); if(hServiceThread != NULL)
{
bServiceRunning = TRUE;
return TRUE;
}
else
{
return FALSE;
}
}void TerminateService()
{
bServiceRunning = FALSE;
SetEvent(hServiceEvent);
UpdateServiceStatus(SERVICE_STOPPED,NO_ERROR,0,0,0);
}DWORD WINAPI ServiceProc(LPVOID lpParameter)//在这个函数里面添加你想要的操作
{
while(bServiceRunning)
{
Beep(450,150);
Sleep(4000);
} return 0;
}BOOL UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,DWORD dwWaitHint)
{
SERVICE_STATUS ServiceStatus;
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwCurrentState = dwCurrentState; if(dwCurrentState == SERVICE_START_PENDING)
{
ServiceStatus.dwControlsAccepted = 0;
}
else
{
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
} if(dwServiceSpecificExitCode == 0)
{
ServiceStatus.dwWin32ExitCode = dwWin32ExitCode;
}
else
{
ServiceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
} ServiceStatus.dwServiceSpecificExitCode = dwServiceSpecificExitCode;
ServiceStatus.dwCheckPoint = dwCheckPoint;
ServiceStatus.dwWaitHint = dwWaitHint; if(!SetServiceStatus(hServiceStatus,&ServiceStatus))
{
TerminateService();
return FALSE;
} return TRUE;
}