前文链接:(一)Win32服务程序编写 —— 使用SC命令创建与删除
前文通过使用sc命令进行服务程序的创建与删除,本文将通过API函数对服务程序进行创建与删除
欢迎大家留言、点赞、鼓励!
使用命令行参数
我们可以用命令行参数来使用一些API进行服务程序的创建与删除:
- 当我们输入ServiceProc -i 时,为创建一个服务程序
- 当我们输入ServiceProc -r 时,为删除一个服务程序
ServiceProc --> ServiceProc.exe
需要的API:
OpenSCManager
CreateService
OpenService
QueryServiceStatus
ControlService
DeleteService
CloseServiceHandle
思路解析
- 创建服务程序:
- 打开服务控制管理器
- 创建服务程序
- 删除服务程序:
- 打开服务控制管理器
- 打开服务程序
- 查询服务程序的状态
- 设置状态为停止
- 删除服务程序
聪明的哥哥姐姐们应该已经看出来了,这个思路就是上面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);
}
使用命令行参数
-
生成之后的可执行文件,放到C盘的根目录下面,便于我们进行操作:
-
打开cmd使用命令行参数进行程序的创建(管理员身份打开):
-
此时,我们可以在服务程序管理器看到我们创建的程序了:
- 输入下面命令行参数即可删除服务程序:
此时,再到服务程序管理器查找,则已经消失了.
作者:浪子花梦
Time:2020.02.07