c - windows xp下如何监控windows服务的状态变化?

标签 c winapi windows-services windows-xp

我正在尝试用 C 编写一个程序,它可以检测某些 Windows 服务(也称为 NT 服务)何时启动或停止。

好像有一个函数NotifyServiceStatusChange ,但这仅适用于 Vista 和 Windows 7。我正在尝试在 Win XP 上执行此操作,那么最好的方法是什么?除了连续轮询,还有其他的吗?

编辑:

有人能用 C 给出答案吗?我也可以使用 C++,但我想远离脚本。

最佳答案

看起来您在 XP 中可以获得的最接近的是 QueryServiceStatusEx (单一服务)或 EnumServicesStatusEx (多项服务)。

为了避免重复调用其中任何一个,一些人推荐 WMI 设置,查询 Win32_Servicestate 属性。见this thread底部了解更多详情。

以下是一个(基本)WMI 脚本,用于监视警报器服务的状态:

strComputer = "."
Set objSWbemServices = GetObject("winmgmts:" &_
    "{impersonationLevel=impersonate}!" &_
    "\\" & strComputer & "\root\cimv2")

Set objEventSource = objSWbemServices.ExecNotificationQuery( _
    "SELECT * FROM __InstanceModificationEvent " &_
    "WITHIN 10 " &_
    "WHERE TargetInstance " &_
    "ISA 'Win32_Service' " &_
    "AND TargetInstance.Name = 'alerter'")

Set objEventObject = objEventSource.NextEvent()
Wscript.Echo "The status of the alerter service just changed."

以上内容和其他示例可在 this TechNet page 上找到.

关于c - windows xp下如何监控windows服务的状态变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1189815/

相关文章:

C 编程循环行和列

给定输入的列宽

C++ 复合字面量

python - 无法在 Python 中导入 dll 模块

c++ - 在 Windows 中执行全屏抓取

c++ - 这个可变参数列表函数调用是如何工作的?

c# - 卸载 C# Windows 服务 - 使用卸载程序

c - 将二进制值存储到无符号 int 数组中

c# - 使用 C# 的文件路径

delphi - 如何发现我的服务的依赖项是什么?