1、服务的主函数以及以及函数的声明,全局变量的定义

  1. #define SERVICE_NAME "srv_follow"
  2.  
  3. SERVICE_STATUS g_ServiceStatus;
  4. SERVICE_STATUS_HANDLE g_hServiceStatusHandle;
  5. void WINAPI service_main(int argc, char** argv);
  6. void WINAPI ServiceHandler(DWORD fdwControl);
  1. //服务的主函数;
  2. int _tmain(int argc, _TCHAR* argv[])
  3. {
  4. //设置服务程序所在的地址;
  5. TCHAR path[MAX_PATH] = {};
  6. GetModuleFileName(NULL,path,MAX_PATH);
  7. _stprintf(path,_T("%s//..//"),path);
  8. SetCurrentDirectory(path);
  9.  
  10. //设置服务表;
  11. SERVICE_TABLE_ENTRY ServiceTable[];
  12. //设置服务到服务表;
  13. ServiceTable[].lpServiceName = _T(SERVICE_NAME);
  14. ServiceTable[].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)service_main;
  15. //表的最后元素必须为NULL;
  16. ServiceTable[].lpServiceName = NULL;
  17. ServiceTable[].lpServiceProc = NULL;
  18.  
  19. //服务分派到服务控制管理器;
  20. StartServiceCtrlDispatcher(ServiceTable);
  21. Logger::getInstance()->info(__FILE__,__LINE__,"StartServiceCtrlDispatcher success!");
  22. DWORD err = GetLastError();
  23.  
  24. return ;
  25. }

2、service_main函数

  1. void WINAPI service_main(int argc, char** argv)
  2. {
  3. //SERVICE_WIN32_OWN_PROCESS
  4. g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
  5. g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
  6. g_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
  7. g_ServiceStatus.dwWin32ExitCode = ;
  8. g_ServiceStatus.dwServiceSpecificExitCode = ;
  9. g_ServiceStatus.dwCheckPoint = ;
  10. g_ServiceStatus.dwWaitHint = ;
  11. g_hServiceStatusHandle = RegisterServiceCtrlHandler(_T(SERVICE_NAME), ServiceHandler);
  12. if (g_hServiceStatusHandle==)
  13. {
  14. DWORD nError = GetLastError();
  15. }
  16. //add your init code here 这里是程序入口
  17.  
  18. // Initialization complete - report running status
  19. g_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
  20. g_ServiceStatus.dwCheckPoint = ;
  21. g_ServiceStatus.dwWaitHint = ;
  22. if(!SetServiceStatus(g_hServiceStatusHandle, &g_ServiceStatus))
  23. {
  24. DWORD nError = GetLastError();
  25. }
  26. }

3、ServiceHandler函数

  1. void WINAPI ServiceHandler(DWORD fdwControl)
  2. {
  3. switch(fdwControl)
  4. {
  5. case SERVICE_CONTROL_STOP:
  6. case SERVICE_CONTROL_SHUTDOWN:
  7. g_ServiceStatus.dwWin32ExitCode = ;
  8. g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
  9. g_ServiceStatus.dwCheckPoint = ;
  10. g_ServiceStatus.dwWaitHint = ;
  11. //add you quit code here 这里释放资源
  12.  
  13. break;
  14. default:
  15. return;
  16. };
  17. if (!SetServiceStatus(g_hServiceStatusHandle, &g_ServiceStatus))
  18. {
  19. DWORD nError = GetLastError();
  20. }
  21. }

以上就是把win32改为后台服务所需要的代码。

win32控制台变服务代码的更多相关文章

  1. 【转】WIN32 控制台程序

    http://blog.csdn.net/houmin0036/article/details/7702236 win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运行的应用 ...

  2. vc2010 win32 控制台应用程序中文乱码

    vc2010 win32 控制台应用程序中文乱码 在 vc2010 上用 win32 控制台程序写些测试代码调用 windows api ,处理错误信息时,发现用 wprintf 输出的错误信息出现了 ...

  3. C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出

    C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出,这里使用到了Windows API SetConsoleCtrlHandler函数 注意:在VS中调试执行时,在处理程序例程中设置断 ...

  4. Win32控制台程序和Win32应用程序

    刚接触Windows那一套,大多数概念都还没建立起来,整理了一下网上对“Win32控制台程序”的理解,谢谢各位网友了. win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运 ...

  5. vs2008 新建win32控制台程序提示:脚本错误

    解决方案: 1.根据错误信息中的url,找到对应文件夹下的htm文件 2.使用notepad++打开default.htm文件,找到错误提示的434行,注释掉433和434行 然后保存文件,重新新建w ...

  6. Win32控制台、Win32项目、MFC项目、CLR控制台、CLR空项目、空项目区别

    转载:https://blog.csdn.net/zfmss/article/details/79244696 1.Win32控制台 初始代码模版以main为程序入口,默认情况下,只链接C++运行时库 ...

  7. SpringCloud发现服务代码(EurekaClient,DiscoveryClient)

    1.说明 本文介绍SpringCloud发现服务代码的开发, 通过使用EurekaClient,DiscoveryClient来发现注册中心的服务等, 从而可以自定义客户端对注册中心的高级用法. 2. ...

  8. VS2017:win32项目与win32控制台应用程序的转换方法

    原文:https://www.cnblogs.com/asuser/articles/12297251.html 刚开始使用VS2017新建项目工程时,有时把应用类型的工程建成控制台类型的工程,在编译 ...

  9. win32控制台实现按任意键退出的功能

    win7之后的五win32 控制台出现了程序运行完之后就立即结束的问题,程序员根本无法看输出的结果.未来让控制台运行完之后能够等待程序员的操作.可以使用: system("PAUSE&quo ...

随机推荐

  1. idou老师教你学istio :基于角色的访问控制

    istio的授权功能,也称为基于角色的访问控制(RBAC),它为istio服务网格中的服务提供命名空间级别.服务级别和方法级别的访问控制.基于角色的访问控制具有简单易用.灵活和高性能等特性.本文介绍如 ...

  2. 实验吧ctf题库web题wp

    经历了学校的校赛,一度自闭,被大佬们刺激的要奋发图强. 1.后台登录 链接: http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php 打开题目首先查看源码, ...

  3. 说说 Python 的变量以及简单数据类型

    1 变量 先来看一个示例: news="我国第一个人工智能规划问世"print(news) 运行结果: 可以看出使用 Python 定义变量很简单,甚至都不需要指定变量的类型. 1 ...

  4. springmvc 事务回滚说明

    Spring中的@Transactional(rollbackFor = Exception.class)属性详解 序言 今天我在写代码的时候,看到了.一个注解@Transactional(rollb ...

  5. 《Linux内核分析》第二周:操作系统是如何工作的

    杨舒雯 20135324 北京电子科技学院 杨舒雯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1 ...

  6. js生成uuid代码

    function uuid() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 3 ...

  7. Eclipse使用较多的快捷键

    快速修正:Ctrl+1 单词补全:Alt+/ 快速Outline:Ctrl+O 删除行:Ctrl+D 选中到行末/行首:Shift+End/Home 注释:Ctrl+/ 变为大/小写:Ctrl+Shi ...

  8. 正则js

    匹配中文字符的正则表达式: [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff] 匹配空行的正则表达式:\n[\s| ]*\r 匹配HTML标记的正则表达式:/&l ...

  9. mysql 清空数据

    清空数据有2 个命令 -- 清空全部数据,不写日志,不可恢复,速度极快 truncate table 表名; -- 清空全部数据,写日志,数据可恢复,速度慢 delete from 表名 业务需求:清 ...

  10. 关于“代码规范”,“Review”和“Check list”(续)

    在前两天的    关于“代码规范”,“Review”和“Check list”    一文中,我给自己列出了Check list,如下: 1.代码能够工作么?它有没有实现预期的功能,逻辑是否正确等. ...