我在开发的时候用到了DLL里面的函数,开始的时候采用的静态导入的方法,但是发现服务开机启动以后就死掉了,这里不是DLL路径的问题。

没办法,自己只得用动态导入的方法,还好,服务自动开机运行了,还算正常吧。

小提示:如果需要弹出MessageBox消息,比如让服务可以与桌面进行交互。  这个在服务里面可以设置。

当然,我这里的初始化参数已经设置好了,在DOS命令里面安装完成后,你会发现,那个框,我已经替你选上了。

//重要说明,服务最好不要直接编译执行,虽然是exe,最好的方式是安装,

安装命令    DOS  下:   ServiceName.exe     /install

卸载命令   DOS下 :ServiceName.exe      /uninstall

直接运行exe不仅会报错,还会导致服务开机不能自动运行。

大多的时候,你直接运行exe都会报1063错误,就是因为你把服务以控制台的方式运行了。

// CreateService.cpp : 定义应用程序的入口点。
//#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include "CreateService.h"//定义全局函数变量
void Init();
BOOL IsInstalled();
BOOL Install();
BOOL Uninstall();
void LogEvent(LPCTSTR pszFormat, ...);
void WINAPI ServiceMain();
void WINAPI ServiceStrl(DWORD dwOpcode);  TCHAR szServiceName[] = _T("WatchDog");
BOOL bInstall;
SERVICE_STATUS_HANDLE hServiceStatus;
SERVICE_STATUS status;
DWORD dwThreadID;  int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR    lpCmdLine,int       nCmdShow)
{Init();  dwThreadID = ::GetCurrentThreadId();  SERVICE_TABLE_ENTRY st[] =  {  { szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },  { NULL, NULL }  };  if (stricmp(lpCmdLine, "/install") == 0)  {  Install();  }  else if (stricmp((LPCTSTR)lpCmdLine, "/uninstall") == 0)  {  Uninstall();  }  else  {if (!::StartServiceCtrlDispatcher(st))  {  LogEvent(_T("Register Service Main Function Error!"));  }  }  return 0;
}//初始化
void Init()
{  hServiceStatus = NULL;  status.dwServiceType = SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;  status.dwCurrentState = SERVICE_START_PENDING;  status.dwControlsAccepted = SERVICE_ACCEPT_STOP;  status.dwWin32ExitCode = 0;  status.dwServiceSpecificExitCode = 0;  status.dwCheckPoint = 0;  status.dwWaitHint = 0;
}  //服务主函数,这在里进行控制对服务控制的注册
void WINAPI ServiceMain()
{status.dwCurrentState = SERVICE_START_PENDING;  status.dwControlsAccepted = SERVICE_ACCEPT_STOP;  //注册服务控制  hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);  if (hServiceStatus == NULL)  {  LogEvent(_T("Handler not installed"));  return;  }  SetServiceStatus(hServiceStatus, &status);  status.dwWin32ExitCode = S_OK;  status.dwCheckPoint = 0;  status.dwWaitHint = 0;  status.dwCurrentState = SERVICE_RUNNING;  SetServiceStatus(hServiceStatus, &status);  //模拟服务的运行。应用时将主要任务放于此即可  //可在此写上服务需要执行的代码,一般为死循环  while(1)  {  FILE *p;p = fopen("c:\\log.txt","ab+");SYSTEMTIME st;GetSystemTime(&st);char time[100] = {0};_sntprintf(time,100,"%4d-%02d-%02d %02d:%02d:%02d\r\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);fwrite(time,strlen(time),1,p);fclose(p);Sleep(1000);}      status.dwCurrentState = SERVICE_STOPPED;  SetServiceStatus(hServiceStatus, &status);
}//Description:          服务控制主函数,这里实现对服务的控制,
//                      当在服务管理器上停止或其它操作时,将会运行此处代码
void WINAPI ServiceStrl(DWORD dwOpcode)
{  switch (dwOpcode)  {  case SERVICE_CONTROL_STOP:  status.dwCheckPoint = 1;  status.dwCurrentState = SERVICE_STOP_PENDING;  SetServiceStatus(hServiceStatus, &status);  Sleep(500);status.dwCheckPoint = 0;  status.dwCurrentState = SERVICE_STOPPED;  SetServiceStatus(hServiceStatus, &status);  PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0);  break;  case SERVICE_CONTROL_PAUSE:  break;  case SERVICE_CONTROL_CONTINUE:  break;  case SERVICE_CONTROL_INTERROGATE:  break;  case SERVICE_CONTROL_SHUTDOWN:exit(0);break;  default:  LogEvent(_T("Bad service request"));  }
}  //判断服务是否已经被安装
BOOL IsInstalled()
{  BOOL bResult = FALSE;  //打开服务控制管理器  SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);  if (hSCM != NULL)  {  //打开服务  SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);  if (hService != NULL)  {  bResult = TRUE;  ::CloseServiceHandle(hService);  }     ::CloseServiceHandle(hSCM);  }  return bResult;
} //安装服务函数
BOOL Install()
{  //检测是否安装过if (IsInstalled())  return TRUE;  //打开服务控制管理器  SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);  if (hSCM == NULL)  {  MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);  return FALSE;  }  //获取程序目录TCHAR szFilePath[MAX_PATH];  ::GetModuleFileName(NULL, szFilePath, MAX_PATH);  //创建服务  SC_HANDLE hService = ::CreateService(hSCM, szServiceName, szServiceName,  SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,SERVICE_AUTO_START , SERVICE_ERROR_NORMAL,  szFilePath, NULL, NULL, _T(""), NULL, NULL);  //检测创建是否成功if (hService == NULL)  {  ::CloseServiceHandle(hSCM);  MessageBox(NULL, _T("Couldn't create service"), szServiceName, MB_OK);  return FALSE;  }//释放资源::CloseServiceHandle(hService);  ::CloseServiceHandle(hSCM);  return TRUE;
}  //删除服务函数
BOOL Uninstall()
{  //检测是否安装过if (!IsInstalled())  return TRUE;  //打开服务控制管理器SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);  if (hSCM == NULL)  {  MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);  return FALSE;  }  //打开具体服务SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);if (hService == NULL)  {  ::CloseServiceHandle(hSCM);  MessageBox(NULL, _T("Couldn't open service"), szServiceName, MB_OK);  return FALSE;  }//先停止服务SERVICE_STATUS status;  ::ControlService(hService, SERVICE_CONTROL_STOP, &status);  //删除服务  BOOL bDelete = ::DeleteService(hService);  ::CloseServiceHandle(hService);  ::CloseServiceHandle(hSCM);  if (bDelete)  return TRUE;  LogEvent(_T("Service could not be deleted"));  return FALSE;
}  //记录服务事件
void LogEvent(LPCTSTR pFormat, ...)
{  TCHAR    chMsg[256];  HANDLE  hEventSource;  LPTSTR  lpszStrings[1];  va_list pArg;  va_start(pArg, pFormat);  _vstprintf(chMsg, pFormat, pArg);  va_end(pArg);  lpszStrings[0] = chMsg;  hEventSource = RegisterEventSource(NULL, szServiceName);  if (hEventSource != NULL)  {  ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);  DeregisterEventSource(hEventSource);  }
}

VC++ 创建Windows服务相关推荐

  1. 用.NET创建Windows服务

    用.NET创建Windows服务 译者说明:我是通过翻译来学习C#的,文中涉及到的有Visual Studio.NET有关操作,我都根据中文版的VS.NET显示信息来处理的,可以让大家不致有误解. 作 ...

  2. 用C#创建Windows服务(Windows Services)

    转载自 hyslove 最终编辑 hyslove Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是 ...

  3. 杂记2:VS2013创建Windows服务实现自动发送邮件

    这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务 ...

  4. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案 参考文章: (1)C#/.NET基于Topshelf创建Windows ...

  5. (转)创建Windows服务(Windows Services)N种方式总结

    转自:http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html 最近由于工作需要,写了一些windows服务程序,有一些经验,我现在 ...

  6. *用C#创建Windows服务(Windows Services)

    Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是一件困难的事,本文就将指导你一步一步创建一个Win ...

  7. 在64位windows下使用instsrv.exe和srvany.exe创建windows服务

    在64位windows下使用instsrv.exe和srvany.exe创建windows服务 在32位的windows下,包括windows7,windows xp以及windows 2003,都可 ...

  8. C# — 创建Windows服务

    以前从来没有接触过C#,对Windows服务也完全不了解,今天通过使用VS2017创建了一个Windows服务,并进行了安装和卸载,目前也是一知半解的地步,简单的做个笔记记录一下,也算是复习了吧. 第 ...

  9. python windows服务_Python创建Windows服务

    首先让我们开始安装Python for Windows扩展: c:test>pip install pywin32 完成后,让我们编写该基类,您的Windows服务将是该基类的子类. ''' S ...

最新文章

  1. python mysql索引 优化神器explain 慢查询
  2. JDK,JRE,JVM区别与联系
  3. Hadoop RPC客户端调用服务代码示例
  4. mmap父子进程间通信
  5. const修饰指针和引用的用法【转贴】
  6. C#LeetCode刷题之#155-最小栈(Min Stack)
  7. java opencv 轮廓检测,OpenCV 轮廓检测 - 雷霄骅(leixiaohua1020)的个人页面 - OSCHINA - 中文开源技术交流社区...
  8. java线程状态_java并发编程之线程状态
  9. 计算机系统-电路设计05-RS触发器的内部电路实现
  10. yolov5训练自己的数据集(一文搞定训练)
  11. Chrome 跨域调试
  12. 利用rufus重装ubuntu
  13. Power bi 3.18 仪表盘
  14. 可解释深度学习:从感受野到深度学习的三大基本任务:图像分类,语义分割,目标检测,让你真正理解深度学习
  15. 自学python面试_Python自学之路-面试题
  16. 你们要的水性粘合剂乳胶漆消泡剂已经出来了
  17. 98-微服务项目的编写(下篇)
  18. group_concat函数用法
  19. 圆形体癣是什么样子的图片_癣是什么样子的图片及皮肤癣症状
  20. Mac中python程序打包成mac-App应用程序

热门文章

  1. Collections集合工具类的方法_addAllshuffle
  2. 七牛云存储:通过SDK上传图片
  3. Response_案例4_验证码_点击切换
  4. Request_获取请求头数据
  5. try_catch_异常处理的第二种方式,自己处理异常
  6. 对称加密算法 - Java加密与安全
  7. URL编码 - Java加密与安全
  8. 侍魂胧月传说显示服务器未开启,侍魂胧月传说为什么进不去 侍魂胧月传说进不去的原因...
  9. sketchup作品_18级园林工程技术专业课程实训作品展
  10. JUnit 5 常用注解与方法