前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用 C 注册 windows 服务程序 (分析 Java Service Wrapper 代码)

如何用 C 注册 windows 服务程序 (分析 Java Service Wrapper 代码)

作者头像
田春峰-JCJC错别字检测
发布2019-02-14 11:35:07
7240
发布2019-02-14 11:35:07
举报
文章被收录于专栏:字根中文校对软件

如何用 C 注册 windows 服务程序 (分析 Java Service Wrapper 代码) 前提:          从http://wrapper.tanukisoftware.org 下载 Java Service Wrapper 的源代码.     因为 Java Service Wrapper 同时提供windows 和 linux 上的实现,所以源文件夹里的代码都是分两份的.     在windows下的实现注册 windows 服务的代码在wrapper_win.c 文件中.     看了其中的代码后你会对作者的专业精神有深刻的体会,在wrapper_win.c文件中的历史变动说明就有300多行,详细描述了每次改动的变化.具体实现的方法中也都有详细的说明,所以看这样的代码基本上不费力气的.     如果非要说看代码是享受,  Java Service Wrapper  的源代码算一个.    下面我们看看它是如何实现注册一个exe文件为windows服务的.     wrapper_win.c中的入口main 函数定义如下:     void _CRTAPI1 main(int argc, char **argv)      //注意main定义的修饰_CRTAPI1     根据argv的输入参数分别执行,注册,取消,开始,停止windows服务的操作:     代码如下:    if(!_stricmp(argv[1],"-i") || !_stricmp(argv[1],"/i")) {           result = wrapperInstall(argc, argv);                              //注册服务    } else if(!_stricmp(argv[1],"-r") || !_stricmp(argv[1],"/r")) {           result = wrapperRemove();                                         //取消注册    } else if(!_stricmp(argv[1],"-t") || !_stricmp(argv[1],"/t")) {           result = wrapperStartService();                                   //启动服务    } else if(!_stricmp(argv[1],"-p") || !_stricmp(argv[1],"/p")) {            result = wrapperStopService(TRUE);                         //停止服务    }

我们重点看windows服务注册的实现,即wrapperInstall(argc, argv) 方法.     第一步: 使用OpenSCManager winapi 获得一个服务控制管理器的句柄.     第二步: 使用CreateService winapi 创建服务,参数很多,重要的有: 服务名 ,服务类型,可执行文件路径等     第三步: 在注册表中添加注册信息: 代码如下:             sprintf(regPath, "SYSTEM//CurrentControlSet//Services//%s", wrapperData->ntServiceName); //ntServiceName就是在服务管理器中看到的服务名             if ((wrapperData->ntServiceDescription != NULL && strlen(wrapperData->ntServiceDescription) > 0)                 && (RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_WRITE, (PHKEY) &hKey) == ERROR_SUCCESS)) {                 RegSetValueEx(hKey, "Description", (DWORD) 0, (DWORD) REG_SZ,                     (const unsigned char *)wrapperData->ntServiceDescription,                     (strlen(wrapperData->ntServiceDescription) + 1));                 RegCloseKey(hKey);             }    原以为很复杂的过程,实际上很简单,对不对?

There are two excellent articles that explain how a simple service application can be created.

   下文介绍一下 使用 JNI 和 java 类 以及注册服务交互的实现.    另:  周星星     void _CRTAPI1 main(int argc, char **argv)      //注意main定义的修饰_CRTAPI1    上面的 关键字 _CRTAPI1 的用法能详细说说吗? 田春峰 20041221 修改

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2004年12月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档