我们看到了360主动防御服务和google更新服务等,让我们来编写一个简单的服务吧。
以下是一个简单的Windows服务示例,使用C语言编写。这个服务会定期监控并记录系统的可用内存,并将结果写入日志文件。
#include #include// 定义睡眠时间,单位为毫秒
define SLEEP_TIME 1000
// 定义日志文件路径
define FILE_PATH "D:test.txt"
// 服务状态SERVICE_STATUS m_ServiceState;// 服务状态句柄SERVICE_STATUS_HANDLE m_ServiceHandle;
void WINAPI ServiceMain(int argc, char* argv);void WINAPI ServiceCtrlHandler(DWORD Opcode);int WriteToLog(char str);
BOOL bRunning;
int main() {SERVICE_TABLE_ENTRY stentry[2];stentry[0].lpServiceName = "demo";stentry[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTIONA)ServiceMain;// 服务的最后一项要设置为NULLstentry[1].lpServiceName = NULL;stentry[1].lpServiceProc = NULL;
StartServiceCtrlDispatcher(stentry);// system("pause");return 0;}
// 服务主函数void WINAPI ServiceMain(int argc, char** argv) {MEMORYSTATUS memstatus;char str[100];int availMem;
// 服务类型和状态m_ServiceState.dwServiceType = SERVICE_WIN32;m_ServiceState.dwCurrentState = SERVICE_START_PENDING;m_ServiceState.dwControlsAccepted = SERVICE_CONTROL_SHUTDOWN | SERVICE_CONTROL_STOP;m_ServiceState.dwWin32ExitCode = 0;m_ServiceState.dwServiceSpecificExitCode = 0;// 下面这两个基本不需要,除非服务启动时间很长m_ServiceState.dwCheckPoint = 0;m_ServiceState.dwWaitHint = 0;// 注册服务控制函数m_ServiceHandle = RegisterServiceCtrlHandler("demo", (LPHANDLER_FUNCTION)ServiceCtrlHandler);if (m_ServiceHandle == NULL) { WriteToLog("RegisterServiceCtrlHandler failed"); return;}WriteToLog("RegisterServiceCtrlHandler success");// 更新服务状态m_ServiceState.dwCurrentState = SERVICE_RUNNING;SetServiceStatus(m_ServiceHandle, &m_ServiceState);memset(str, ' ', 100);bRunning = TRUE;while (bRunning) { GlobalMemoryStatus(&memstatus); availMem = memstatus.dwAvailVirtual / 1024 / 1024; sprintf_s(str, 50, "available memory is %d MB, use %d %%", availMem, memstatus.dwMemoryLoad); WriteToLog(str); Sleep(SLEEP_TIME);}WriteToLog("service stop!");}
// 服务控制函数(启动,暂停等)void WINAPI ServiceCtrlHandler(DWORD Opcode) {switch (Opcode) {case SERVICE_CONTROL_STOP:bRunning = FALSE;m_ServiceState.dwCurrentState = SERVICE_STOPPED;break;case SERVICE_CONTROL_SHUTDOWN:bRunning = FALSE;m_ServiceState.dwCurrentState = SERVICE_STOPPED;break;default:break;}SetServiceStatus(m_ServiceHandle, &m_ServiceState);}
int WriteToLog(char str) {FILE pFile;fopen_s(&pFile, FILE_PATH, "a+");fprintf_s(pFile, "%sn", str);fclose(pFile);return 0;}
编译并生成后,可以使用
sc命令来安装服务:sc create giantbranchDemo binpath= D:demo.exe
安装后,可以在服务管理界面看到新安装的服务:
您可以从图形界面启动服务,也可以通过
sc命令启动、停止和删除服务:
豆包AI编程
豆包推出的AI编程助手
483 查看详情
![]()
启动、停止和删除服务的命令如下:
sc startsc stopsc delete如果程序本身自带启动和删除功能,可以使用以下代码:
#includeinclude
// 定义睡眠时间,单位为毫秒
define SLEEP_TIME 1000
// 定义日志文件路径
define FILE_PATH "C:test.txt"
define SERVICENAME "practice"
// 服务状态SERVICE_STATUS m_ServiceState;// 服务状态句柄SERVICE_STATUS_HANDLE m_ServiceHandle;
void WINAPI ServiceMain(int argc, char* argv);void WINAPI ServiceCtrlHandler(DWORD Opcode);int WriteToLog(char str);BOOL InstallService();void DelService();
BOOL bRunning;
int main(int argc, char** argv[]) {SERVICE_TABLE_ENTRY stentry[2];if (argc == 2) {if (!strcmp(argv[1], "-i")) {InstallService();} else if (!strcmp(argv[1], "-d")) {DelService();}return 0;}
stentry[0].lpServiceName = SERVICENAME;stentry[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTIONA)ServiceMain;// 服务的最后一项要设置为NULLstentry[1].lpServiceName = NULL;stentry[1].lpServiceProc = NULL;StartServiceCtrlDispatcher(stentry);return 0;}
// 服务主函数void WINAPI ServiceMain(int argc, char** argv) {MEMORYSTATUS memstatus;char str[100];int availMem;
// 服务类型和状态m_ServiceState.dwServiceType = SERVICE_WIN32;m_ServiceState.dwCurrentState = SERVICE_START_PENDING;m_ServiceState.dwControlsAccepted = SERVICE_CONTROL_SHUTDOWN | SERVICE_CONTROL_STOP;m_ServiceState.dwWin32ExitCode = 0;m_ServiceState.dwServiceSpecificExitCode = 0;// 下面这两个基本不需要,除非服务启动时间很长m_ServiceState.dwCheckPoint = 0;m_ServiceState.dwWaitHint = 0;// 注册服务控制函数m_ServiceHandle = RegisterServiceCtrlHandler(SERVICENAME, (LPHANDLER_FUNCTION)ServiceCtrlHandler);if (m_ServiceHandle == NULL) { WriteToLog("RegisterServiceCtrlHandler failed"); return;}WriteToLog("RegisterServiceCtrlHandler success");// 更新服务状态m_ServiceState.dwCurrentState = SERVICE_RUNNING;SetServiceStatus(m_ServiceHandle, &m_ServiceState);memset(str, ' ', 100);bRunning = TRUE;GlobalMemoryStatus(&memstatus);availMem = memstatus.dwAvailVirtual / 1024 / 1024;sprintf_s(str, 50, "available memory is %d MB, use %d %%", availMem, memstatus.dwMemoryLoad);WriteToLog(str);WriteToLog("service is Running!");}
// 服务控制函数(启动,暂停等)void WINAPI ServiceCtrlHandler(DWORD Opcode) {switch (Opcode) {case SERVICE_CONTROL_STOP:case SERVICE_CONTROL_SHUTDOWN:bRunning = FALSE;m_ServiceState.dwWin32ExitCode = 0;m_ServiceState.dwCurrentState = SERVICE_STOPPED;break;default:break;}SetServiceStatus(m_ServiceHandle, &m_ServiceState);}
int WriteToLog(char str) {FILE pFile;fopen_s(&pFile, FILE_PATH, "a+");fprintf_s(pFile, "%sn", str);fclose(pFile);return 0;}
BOOL InstallService() {char strDir[1024];SC_HANDLE scHandler, schService;LPCTSTR lpszBinaryPathName;
// GetCurrentDirectory(1024, strDir);GetModuleFileName(NULL, strDir, 1024);printf("%sn", strDir);lpszBinaryPathName = strDir;scHandler = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (scHandler == NULL) { printf("open scmanager failed! May be you don't have the privilage?");}schService = CreateService( scHandler, SERVICENAME, SERVICENAME, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, lpszBinaryPathName, NULL, NULL, NULL, NULL, NULL);if (schService == NULL) { printf("create service failed~"); return FALSE;}CloseServiceHandle(schService);CloseServiceHandle(scHandler);return TRUE;}
void DelService() {SC_HANDLE scHandler;SC_HANDLE schService;SERVICE_STATUS status;BOOL isSuccess;DWORD errCode;
scHandler = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (scHandler == NULL) { printf("open scmanager failed! May be you don't have the privilage?"); return;}schService = OpenService(scHandler, SERVICENAME, SC_MANAGER_ALL_ACCESS | DELETE);if (schService == NULL) { errCode = GetLastError(); printf("OpenService failed! code:%dn", errCode); return;}isSuccess = QueryServiceStatus(schService, &status);if (!isSuccess) { printf("QueryServiceStatus failed!"); return;}if (status.dwCurrentState != SERVICE_STOPPED) { isSuccess = ControlService(schService, SERVICE_CONTROL_STOP, &status); if (!isSuccess) { printf("Stop Service failed!"); return; }}isSuccess = DeleteService(schService);if (!isSuccess) { printf("DeleteService failed"); return;} else { printf("DeleteService success");}CloseServiceHandle(scHandler);CloseServiceHandle(schService);}
这样,您就可以通过命令行参数
-i和-d来安装和删除服务了。以上就是Windows服务编程的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/435061.html

微信扫一扫
支付宝扫一扫