VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 721|回复: 2

[求助] C语言的程序如何实现把自己加入服务

[复制链接]
69_avatar_middle
在线会员 发表于 2016-8-23 00:07:03 | 显示全部楼层 |阅读模式
3驿站币
以下为代码,但是发现main_2()中的CreateService()在加载自己本身作为服务程序启动的时候,没法带参数。不知道怎么解决。
而且服务输出都看不见,不知道如何调试。

  1. #include "main.h"

  2. int main(int argc,char *argv[])
  3. {
  4.         if(argc<2)
  5.                 main_2();
  6.         else
  7.                 main_1();
  8.         system("pause");
  9.         return 0;
  10. }

  11. void main_1( )
  12. {
  13.         // 设置SERVICE_TABLE_ENTRY 数据结构,以NULL 结构结束,
  14.         // 作为StartServiceCtrlDispatcher 函数的参数。
  15.         SERVICE_TABLE_ENTRY   DispatchTable[] =
  16.         {
  17.                 { "Sample_Srv", (LPSERVICE_MAIN_FUNCTION) SplSrvServiceStart },
  18.                 { NULL, NULL }
  19.         };
  20.         if (!StartServiceCtrlDispatcher( DispatchTable))
  21.         {
  22.                 SvcDebugOut(" [SPLSRV_SERVICE] StartServiceCtrlDispatcher (%d)\n",
  23.                         GetLastError());
  24.         }
  25. }

  26. void main_2(  )
  27. {
  28.         TCHAR szBinFilePath[MAX_PATH];
  29.         PTCHAR pTemp;
  30.         DWORD dwStopError;
  31.         // 构造服务可执行程序的路径
  32.         GetModuleFileName(NULL,szBinFilePath,MAX_PATH);
  33.         pTemp = szBinFilePath+lstrlen(szBinFilePath);
  34. //        while(*--pTemp!='\\');
  35. //        lstrcpy(pTemp,TEXT("\\SplSrv.exe"));

  36.         // 打开 SCM
  37.         schSCManager = OpenSCManager(
  38.                 NULL,                    // local machine
  39.                 NULL,                    // ServicesActive database
  40.                 SC_MANAGER_ALL_ACCESS);  // full access rights

  41.         if (NULL == schSCManager)
  42.                 printf("OpenSCManager failed (%d)\n", GetLastError());

  43.         // 创建服务
  44.         CreateSampleService(schSCManager, szBinFilePath, szServiceName);
  45.         // 启动服务
  46.         StartSampleService(schSCManager,szServiceName);
  47.         // 发送请求控制
  48.         ControlSampleService(SERVICE_CONTROL_INTERROGATE);
  49.         ControlSampleService(SERVICE_CONTROL_CONTINUE);
  50.         // 停止服务
  51.         dwStopError = StopService( schSCManager, szServiceName,
  52.                 TRUE, 1000);

  53.         if(ERROR_SUCCESS == dwStopError)
  54.         {
  55.                 printf("Service Stoped\n");
  56.         }
  57.         else
  58.         {
  59.                 printf("Service stoped error (%u)\n",dwStopError);
  60.         }
  61.         // 删除服务
  62.         DeleteSampleService(szServiceName);
  63.         CloseServiceHandle(schSCManager);
  64. }
复制代码





上一篇:VC单文档下如何添加工具栏的按钮
下一篇:VC单文档/多文档问题
51_avatar_middle
online_admins 发表于 2016-8-23 08:39:51 | 显示全部楼层
详见《C语言黑客编程》里面有详细的讲解:
https://www.cctry.com/thread-453-1-1.html
69_avatar_middle
ico_lz  楼主| 发表于 2016-9-1 22:32:36 | 显示全部楼层
Syc 发表于 2016-8-23 08:39
详见《C语言黑客编程》里面有详细的讲解:
https://www.cctry.com/thread-453-1-1.html

谢谢!

现在还有2个问题。
1、StartServiceCtrlDispatcher都说会挂起来循环,但是我在ServiceMain函数里调用了一个每秒发送ping包的程序。在服务第一次创建并启动的时候提示能正常启动,但是去服务里一看,服务已经停止了,抓包也显示并没有发送ping包。只有在StartServiceCtrlDispatcher之后加了个无限循环,才看到ping包一直在发送。
不知道是我理解这个挂起相当于主线程卡在那里,但是子线程可以一直动错了。
2、在没有加循环的情况下,就是StartServiceCtrlDispatcher之后就结束程序的情况下,第一次创建服务并启动服务是正常的,但是马上就结束了。再次启动服务的时候,就出现1067进程意外终止(在本地计算机无法启动)。但是只要在StartServiceCtrlDispatcher之后加上while循环,就没有事情了。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

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

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

GMT+8, 2019-6-26 13:13

Powered by Discuz! X3.4

© 2009-2019 cctry.com

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