(二)Win32服务程序编写 —— 使用命令行参数创建与删除

前文链接:(一)Win32服务程序编写 —— 使用SC命令创建与删除
前文通过使用sc命令进行服务程序的创建与删除,本文将通过API函数对服务程序进行创建与删除
欢迎大家留言、点赞、鼓励!


使用命令行参数

我们可以用命令行参数来使用一些API进行服务程序的创建与删除:
在这里插入图片描述

  • 当我们输入ServiceProc -i 时,为创建一个服务程序
  • 当我们输入ServiceProc -r 时,为删除一个服务程序

ServiceProc --> ServiceProc.exe


需要的API:
OpenSCManager
CreateService
OpenService
QueryServiceStatus
ControlService
DeleteService
CloseServiceHandle

思路解析

  • 创建服务程序:
  1. 打开服务控制管理器
  2. 创建服务程序
  • 删除服务程序:
  1. 打开服务控制管理器
  2. 打开服务程序
  3. 查询服务程序的状态
  4. 设置状态为停止
  5. 删除服务程序

聪明的哥哥姐姐们应该已经看出来了,这个思路就是上面API的顺序而来.


程序的编写(基于前文代码追加)

首先,我们将 main改变为可以接受命令行参数的等式:
在这里插入图片描述
然后我们在 main中写出如下判断的代码:

if (argc == 2)	// 命令行有两个参数
{
    if (!stricmp(argv[1], "-i"))	// 不区分大小写的判断
    {
        InstallCmdService();		// 安装服务程序
    }
    else if (!stricmp(argv[1], "-r"))
    {
        DelServices();			// 删除服务程序
    }
}

上面看见的两个函数,是我们自己定义的安装与删除程序的方法.

安装服务程序函数编写

每一行代码,都做了详细的解释

BOOL InstallCmdService()
{
    SC_HANDLE schSCManager; 	// 服务管理器的句柄	
    SC_HANDLE schSerivce;   	// 服务程序的句柄
    
    char strDir[MAX_PATH];	// 存放服务程序的完整路径
    GetModuleFileName(NULL, strDir, sizeof(strDir));	// 获取路径
    
    // 打开服务控制管理器
    schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL)
    {
        cout << "Open schSCManager falied……" << endl;
        return FALSE;
    }

    // 函数参加具体是什么意思,可以查看win32手册或者百度(只不过后面五个默认都为NULL)
    schService = CreateService(schSCManager, "bbbbbb", NULL, SERVICE_ALL_ACCESS,
        SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
        (LPCSTR)strDir, NULL, NULL, NULL, NULL, NULL);
    if (schService == NULL)
    {
        cout << "Create schSerivce falied……" << endl;
        return FALSE;
    }
    
    // 关闭服务程序的句柄
    CloseServiceHandle(schSerivce);
    CloseServiceHandle(schSCManager);
    return TRUE;
}

安装程序的函数比较简单,就是两个API的简单使用

删除服务程序的编写

void DelServices()
{
    SC_HANDLE scm;	// 服务管理器的句柄 
    SC_HANDLE service;  // 服务程序的句柄
    BOOL isSuccess;	// 用于判断 
    
    // 打开服务程序管理器
    scm = OpenSCManage(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (scm == NULL)
    {
        cout << "OpenSCManager Error" << endl;
        return;
    }

    // 打开服务程序
    service = OpenService(scm, name, SERVICE_ALL_ACCESS);
    if (!service)
    {
        cout << "OpenService Error" << endl;
        return;
    }

    // 查询服务程序状态
    isSuccess = QueryServiceStatus(service, &status);
    if (!isSuccess)
    {
        cout << "Stop Service Error" << endl;
        return;        
    }

    // 删除服务程序
    isSuccess = DeleteService(service);
    if (!isSuccess)
    {
        cout << "Delete Service Fail!" << endl;
        return;
    }
    else
    {
        cout << "Delete Service success!" << endl;
    }

    // 关闭服务程序句柄
    CloseServiceHandle(service);
    CloseServiceHandle(scm);
}

使用命令行参数

  1. 生成之后的可执行文件,放到C盘的根目录下面,便于我们进行操作:
    在这里插入图片描述

  2. 打开cmd使用命令行参数进行程序的创建(管理员身份打开):
    在这里插入图片描述

  3. 此时,我们可以在服务程序管理器看到我们创建的程序了:

在这里插入图片描述

  1. 输入下面命令行参数即可删除服务程序:
    在这里插入图片描述

此时,再到服务程序管理器查找,则已经消失了.


作者:浪子花梦
Time:2020.02.07

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值