SC_HANDLE OpenSCManager( LPCTSTR lpMachineName, LPCTSTR lpDatabaseName, DWORD dwDesiredAccess 如果以administrators的权限创建服务的话,该字段的值为SC_MANAGER_ALL_ACCESS ); CreateService: The CreateService function creates a service object and adds it to the specified service control manager database SC_HANDLE CreateService( SC_HANDLE hSCManager, LPCTSTR lpServiceName, //服务的名称 LPCTSTR lpDisplayName, DWORD dwDesiredAccess, //SERVICE_ALL_ACCESS DWORD dwServiceType, //SERVICE_WIN32_OWN_PROCESS DWORD dwStartType, //SERVICE_AUTO_START DWORD dwErrorControl, //SERVICE_ERROR_IGNORE LPCTSTR lpBinaryPathName, //指向二进制文件的路径 LPCTSTR lpLoadOrderGroup, LPDWORD lpdwTagId, LPCTSTR lpDependencies, LPCTSTR lpServiceStartName, LPCTSTR lpPassword ); Type Meaning SERVICE_FILE_SYSTEM_DRIVER File system driver service. SERVICE_KERNEL_DRIVER Driver service. SERVICE_WIN32_OWN_PROCESS Service that runs in its own process. SERVICE_WIN32_SHARE_PROCESS Service that shares a process with other services. StartService: 启动一个服务 BOOL StartService( SC_HANDLE hService, DWORD dwNumServiceArgs, LPCTSTR* lpServiceArgVectors ); QueryServiceStatus: BOOL QueryServiceStatus( SC_HANDLE hService, LPSERVICE_STATUS lpServiceStatus ); Return: If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. RegisterServiceCtrlHandler: 注册一个服务 SERVICE_STATUS_HANDLE RegisterServiceCtrlHandler( LPCTSTR lpServiceName, //服务的名字 LPHANDLER_FUNCTION lpHandlerProc //服务的控制函数的名字 ); 创建服务线程 服务完成的功能在这里调用 CreateThread HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, //线程函数的名字 LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); 附上我的代码: #include "windows.h" #include "stdio.h" //全局变量 SERVICE_STATUS ServiceStatus; SERVICE_STATUS_HANDLE ServiceStatusHandle; //函数声明 void InstallService(char *szServicePath); void WINAPI ServiceStart(DWORD dwArgc,LPTSTR *lpArgv); void WINAPI ServiceControl(DWORD dwCode); DWORD WINAPI Service(LPVOID lpvThread); //服务功能函数 int main(int argc, char* argv[]) { //定义SERVICE_TABLE_ENTRY DispatchTable[] 结构 SERVICE_TABLE_ENTRY DispatchTable[2] = { {"mixu_yy", ServiceStart}, {NULL, NULL} }; //安装或者打开服务 StartServiceCtrlDispatcher(DispatchTable); InstallService(argv[0]); return 0; } //函数定义 void InstallService(char *szServicePath) { SC_HANDLE schSCManager; SC_HANDLE schService; SERVICE_STATUS InstallServiceStatus; DWORD dwErrorCode; //打开服务管理数据库 schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if(schSCManager == NULL) { //Open Service Control Manager Database Failed!; return; } //创建服务 schService = CreateService( schSCManager, "mixu_yy", "mixu_yy", SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, szServicePath, NULL, NULL, NULL, NULL, NULL); if(schService == NULL) { dwErrorCode = GetLastError(); if(dwErrorCode != ERROR_SERVICE_EXISTS) { //创建服务失败 CloseServiceHandle(schSCManager); return; } else { //要创建的服务已经存在 schService = OpenService(schSCManager, "mixu_yy", SERVICE_START); if(schService == NULL) { //Open Service Failed!; CloseServiceHandle(schSCManager); return; } } } else { //Create Service Success!; } //启动服务 if(StartService(schService, 0, NULL)==0 ) { //启动失败 dwErrorCode = GetLastError(); if(dwErrorCode == ERROR_SERVICE_ALREADY_RUNNING) { //Service already run!; CloseServiceHandle(schSCManager); CloseServiceHandle(schService); return ; } } else { //Service pending } while(QueryServiceStatus(schService, &InstallServiceStatus) != 0) { if(InstallServiceStatus.dwCurrentState == SERVICE_START_PENDING) { //Sleep(100); } else { break; } } if(InstallServiceStatus.dwCurrentState != SERVICE_RUNNING) { //Failure! } else { //Sucess! } //擦屁股 CloseServiceHandle(schSCManager); CloseServiceHandle(schService); return; } void WINAPI ServiceStart(DWORD dwArgc,LPTSTR *lpArgv) { HANDLE hThread; ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; ServiceStatusHandle = RegisterServiceCtrlHandler("mixu_yy", ServiceControl); if(ServiceStatusHandle == 0) { //error return; } ServiceStatus.dwCurrentState = SERVICE_RUNNING; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0) { //SetServiceStatus error! return; } //创建服务线程 服务完成的功能在这里调用 hThread = CreateThread(NULL, 0, Service, NULL, 0, NULL); if(hThread == NULL) { //CreateThread error! return; } CloseHandle(hThread); return; } //服务控制模块 void WINAPI ServiceControl(DWORD dwCode) { switch(dwCode) { case SERVICE_CONTROL_PAUSE: ServiceStatus.dwCurrentState = SERVICE_PAUSED; break; case SERVICE_CONTROL_CONTINUE: ServiceStatus.dwCurrentState = SERVICE_RUNNING; break; case SERVICE_CONTROL_STOP: ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0) { //SetServiceStatus error! } return; case SERVICE_CONTROL_INTERROGATE: break; default: break; } if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0) { //SetServiceStatus error! } return ; } //服务线程函数 DWORD WINAPI Service(LPVOID lpvThread) { //实现函数功能的地方。 return 1; } |