VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 684|回复: 1

把mfc转为服务程序

[复制链接]
53_avatar_middle
最佳答案
3 
在线会员 发表于 2020-7-3 16:09:45 来自手机 | 显示全部楼层 |阅读模式
我写了一个mfc程序,后来把他创建成服务,但开启的时候会出错,查了一下要服务程序才行,怎么把mfc转为服务程序,大佬们能解惑一下吗?




上一篇:请问如何实现图中列表视图的项目添加?
下一篇:VC设计界面调用matlab子程序
70_avatar_middle
最佳答案
49 
在线会员 发表于 2020-7-3 16:54:46 | 显示全部楼层
一般来说,服务没有界面
你想用服务来干什么呢? 如果是开机自启动,添加注册表或者计划任务就可以了
提升权限?可能性不大吧
如果是守护进程之类的,不需要MFC
下面是我原来写(抄)的一个简单的服务测试用例,在while循环中做自己想做的事
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <ctime>

  4. #define SERVER_NAME                "NB SERVER TEST"
  5. #define SZDEPENDENCIES       ""

  6. SERVICE_STATUS_HANDLE sshStatusHandle;
  7. SERVICE_STATUS status;
  8. int InitService();
  9. void PrintLog(char *fmt, ...);

  10. DWORD WINAPI service_ctrl(
  11.                                                   __in  DWORD dwCtrlCode,
  12.                                                   __in  DWORD dwEventType,
  13.                                                   __in  LPVOID lpEventData,
  14.                                                   __in  LPVOID lpContext
  15.                                                   )
  16. {
  17.         // Handle the requested control code.
  18.         //
  19.         switch (dwCtrlCode)
  20.         {
  21.                 // Stop the service.
  22.                 //
  23.                 // SERVICE_STOP_PENDING should be reported before
  24.                 // setting the Stop Event - hServerStopEvent - in
  25.                 // ServiceStop().  This avoids a race condition
  26.                 // which may result in a 1053 - The Service did not respond...
  27.                 // error.
  28.         case SERVICE_CONTROL_STOP:
  29.                 {
  30.                         //ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 0);
  31.                         status.dwCurrentState = SERVICE_STOPPED;
  32.                         SetServiceStatus(sshStatusHandle, &status);;
  33.                         break;
  34.                 }

  35.                 // Update the service status.
  36.         case SERVICE_CONTROL_INTERROGATE:
  37.                 {
  38.                         break;
  39.                 }

  40.                 // service control device event
  41.         case SERVICE_CONTROL_DEVICEEVENT:
  42.                 {
  43.                         break;
  44.                 }
  45.         default:
  46.                 {
  47.                         break;
  48.                 }
  49.         }

  50.         return NO_ERROR;
  51. }
  52. void ServerTest(){
  53.         int i=0;
  54.         while(1){
  55.                 Sleep(5000);
  56.                 PrintLog("第 %6d 次PrintLog.",i++);
  57.         }
  58. }

  59. void WINAPI service_main(DWORD dwArgc, LPTSTR *lpszArgv)
  60. {
  61.         status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
  62.         status.dwCurrentState = SERVICE_START_PENDING;
  63.         status.dwControlsAccepted = SERVICE_ACCEPT_STOP |
  64.                 SERVICE_ACCEPT_SHUTDOWN;
  65.         status.dwWin32ExitCode = 0;
  66.         status.dwServiceSpecificExitCode = 0;
  67.         status.dwCheckPoint = 0;
  68.         status.dwWaitHint = 0;
  69.         // register our service control handler:
  70.         //
  71.         sshStatusHandle = RegisterServiceCtrlHandlerEx( TEXT(SERVER_NAME), service_ctrl, NULL );
  72.         if (!sshStatusHandle)
  73.         {
  74.                 return;
  75.         }
  76.         // SERVICE_STATUS members that don't change in example
  77.         //
  78.         status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
  79.         status.dwServiceSpecificExitCode = 0;
  80.         status.dwWin32ExitCode = S_OK;
  81.         status.dwCheckPoint = 0;
  82.         status.dwWaitHint = 0;
  83.         status.dwCurrentState = SERVICE_RUNNING;
  84.         status.dwControlsAccepted = SERVICE_ACCEPT_STOP |
  85.                 SERVICE_ACCEPT_SHUTDOWN;

  86.         BOOL bRe = SetServiceStatus(sshStatusHandle, &status);

  87.         //ServerTest();
  88.         return;
  89. }


  90. void Initialize()
  91. {
  92.         sshStatusHandle = NULL;
  93.         status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
  94.         status.dwCurrentState = SERVICE_STOPPED;
  95.         status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
  96.         status.dwWin32ExitCode = 0;
  97.         status.dwServiceSpecificExitCode = 0;
  98.         status.dwCheckPoint = 0;
  99.         status.dwWaitHint = 0;

  100. }

  101. int main()
  102. {

  103.         BOOL bResult=TRUE;
  104.         SERVICE_TABLE_ENTRY st[2];
  105.         st[0].lpServiceName = SERVER_NAME;
  106.         st[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)service_main;
  107.         st[1].lpServiceName = NULL;
  108.         st[1].lpServiceProc = NULL;

  109.         //设置SERVICE_STATUS
  110.         Initialize();
  111.        
  112.         bResult = StartServiceCtrlDispatcher(st);
  113.         return 0;
  114. }

  115. //日志函数
  116. void PrintLog(char *fmt, ...)
  117. {
  118.         DWORD dwRe = GetLastError();
  119.         time_t now = time(0);
  120.         tm *ltm = localtime(&now);
  121.         char sztime[1024] = {0};
  122.         sprintf(sztime,"%04d-%02d-%02d %02d:%02d:%02d    ",1900+ltm->tm_year,1+ltm->tm_mon,ltm->tm_mday,ltm->tm_hour,ltm->tm_min,ltm->tm_sec);
  123.         strcat_s(sztime,fmt);

  124.         FILE *fp = NULL;
  125.         va_list argp;        //定义保存函数参数的结构
  126.         int argn = 0;        //纪录参数个数

  127.         char szTmpPath[MAX_PATH] = {0};
  128.         strcat_s(szTmpPath,"C:\\NB_Server_Test.log");
  129.         errno_t err = fopen_s(&fp, szTmpPath, "a+t");

  130.         if( fp != NULL )
  131.         {
  132.                 va_start(argp,fmt);

  133.                 vfprintf(fp, sztime, argp);
  134.                 fprintf(fp, "\n");
  135.                 fclose(fp);

  136.                 va_end(argp);
  137.         }
  138.         SetLastError(dwRe);
  139. }
复制代码

评分

参与人数 1威望 +2 驿站币 +2 热心值 +2 收起 理由
51_avatar_small Syc + 2 + 2 + 2

查看全部评分

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-5-29 22:48

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表