编写windows服务程序
2016-01-13 19:11
381 查看
初学VC,写了一个最简单的服务程序,windows API 真心太多了,留作笔记。以后说不定改改还能用上。
编译后生成exe文件:
test.exe -i //安装服务
test.exe -r //删除服务
while循环中写自己的逻辑。
**注意!! 每次代码改变服务状态后一定表忘记SetServiceStatus一下,不然真报错不商量。
编译后生成exe文件:
test.exe -i //安装服务
test.exe -r //删除服务
while循环中写自己的逻辑。
**注意!! 每次代码改变服务状态后一定表忘记SetServiceStatus一下,不然真报错不商量。
#include <Windows.h> #include <stdio.h> BOOL flag = TRUE; void WINAPI ServiceMain(DWORD argc, LPSTR** argv); void WINAPI sHandler(DWORD request); BOOL installService(); BOOL unInstallService(); SERVICE_STATUS m_Status; SERVICE_STATUS_HANDLE m_Handle; int main(int argc,char* argv[]) { if (argc==2) { if (!_stricmp(argv[1],"-i")) { installService(); } else if(!_stricmp(argv[1],"-r")) { unInstallService(); } return 0; } SERVICE_TABLE_ENTRY table[2]; table[0].lpServiceName = "AAA"; table[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; table[1].lpServiceName = NULL; table[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(table); } void WINAPI ServiceMain(DWORD argc, LPSTR ** argv) { m_Status.dwCheckPoint = 0; m_Status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; m_Status.dwCurrentState = SERVICE_START_PENDING; m_Status.dwServiceSpecificExitCode = 0; m_Status.dwServiceType = SERVICE_WIN32; m_Status.dwWaitHint = 0; m_Status.dwWin32ExitCode = 0; m_Handle = RegisterServiceCtrlHandler("AAA",sHandler); if (m_Handle!=0) { m_Status.dwCurrentState = SERVICE_RUNNING; } SetServiceStatus(m_Handle, &m_Status); while (flag) { FILE *fp; fp = fopen("c:\\demo\\test.txt", "a+"); fputs("test data!\r\n",fp); fclose(fp); Sleep(10000); } CloseServiceHandle(m_Handle); } void WINAPI sHandler(DWORD request) { switch (request) { case SERVICE_CONTROL_STOP: flag = FALSE; m_Status.dwCurrentState = SERVICE_STOPPED; break; case SERVICE_CONTROL_SHUTDOWN: flag = FALSE; m_Status.dwCurrentState = SERVICE_STOPPED; break; default: break; } SetServiceStatus(m_Handle, &m_Status); } BOOL installService() { SC_HANDLE scHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (scHandle==NULL) { printf("openSCManager failed!"); return FALSE; } scHandle = CreateService(scHandle, "AAA", NULL, SC_MANAGER_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, "c:\\demo\\AAA.exe", NULL, NULL, NULL, NULL, NULL); if (scHandle == NULL) { printf("createService failed!"); return FALSE; } printf("createService success!\r\n"); if (StartService(scHandle, NULL, NULL)) { printf("start service success!\r\n"); } else { printf("start failed!"); } CloseServiceHandle(scHandle); return TRUE; } BOOL unInstallService() { SC_HANDLE scm, m_service; SERVICE_STATUS unStatus; scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (scm==NULL) { printf("openscmanage failed!"); return FALSE; } else { m_service = OpenService(scm, "AAA", SC_MANAGER_ALL_ACCESS); if (m_service==NULL) { printf("openservice failed!"); return FALSE; } else { if (QueryServiceStatus(m_service, &unStatus)) { if (unStatus.dwCurrentState!=SERVICE_STOPPED) { if (!ControlService(m_service, SERVICE_CONTROL_STOP, &unStatus)) { printf("controlservice stop failed!"); return FALSE; } } if (DeleteService(m_service)) { printf("Delete success!"); } else { printf("Delete failed!"); return FALSE; } } else { printf("Queryservice failed!"); return FALSE; } } } return TRUE; }
相关文章推荐
- Java URL处理
- listView 滑动时 滑到一半自动滑动到对应的位置
- maven搭建jersey+Spring4+JPA+Druid+quartz
- RabbitMQ入门教程 For Java【3】 - Publish/Subscribe
- 分库分表策略的可实现架构
- VS2013中应用项目生成DLL
- Amoeba实现mysql读写分离
- Xcode 7遇到 App Transport Security has blocked a cleartext HTTP 错误
- badusb_nc反弹shell
- forEach嵌套循环的问题
- C#:文件、路径(Path_File)
- 深入word2vec(1) - 第一次训练
- windows下grinder压力测试
- 在CSDN建立博客的原因
- Android Volley二次封装
- 通过参加工作日期计算出年假
- Android PopupWindow的使用
- kafka入门
- ostep01-Introduction to Operating Systems
- ubuntu 14.04 install latex and simple setting