Windows服务编程

我们看到了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

Windows服务编程

安装后,可以在服务管理界面看到新安装的服务:

Windows服务编程

您可以从图形界面启动服务,也可以通过sc命令启动、停止和删除服务:

Windows服务编程

豆包AI编程 豆包AI编程

豆包推出的AI编程助手

豆包AI编程 483 查看详情 豆包AI编程

启动、停止和删除服务的命令如下:

sc startsc stopsc delete

如果程序本身自带启动和删除功能,可以使用以下代码:

#include 

include

// 定义睡眠时间,单位为毫秒

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何在Linux中查看命令历史 Linux history命令使用技巧
上一篇 2025年11月7日 15:45:27
Oracle 启动例程 STARTUP参数说明
下一篇 2025年11月7日 15:45:29

相关推荐

发表回复

登录后才能评论
关注微信