我如何获得如下所示的Windows服务说明?
我尝试使用Windows注册表,但大多数服务似乎没有描述,或者描述值存储在dll中 - 所以这似乎是错误的方法。
示例:
Windows时间服务(W32Time),注册表中的说明显示为
@%SYSTEMROOT%\ SYSTEM32 \ w32time.dll,-201
然而,在Services.msc中看到的实际描述是:
维护所有客户端和服务器上的日期和时间同步 网络。如果此服务已停止,则日期和时间同步 将无法使用。如果禁用此服务,则表示任何服务 明确依赖它将无法启动。
-
我一直在MSDN网站上搜索并发现了这个:
lpDescription
服务的描述。如果此成员为NULL,则 描述保持不变。如果此值为空字符串(“”), 删除当前描述。
服务描述不得超过注册表值的大小 类型REG_SZ。
该成员可以使用以下格式指定本地化字符串:
@ [路径] DLLNAME。-strID
标识符为strID的字符串是从dllname加载的;路径是 可选的。有关详细信息,请参阅RegLoadMUIString ....
-
pszOutBuf [out,optional]
指向接收字符串的缓冲区的指针。
以下表单的字符串会受到特殊处理:
@ [路径] \ DLLNAME。-strID
标识符为strID的字符串是从dllname加载的;路径是 可选的。如果pszDirectory参数不为NULL,则该目录为 预先添加到注册表数据中指定的路径。注意 dllname可以包含要扩展的环境变量。
我认为这会建议为什么查看注册表会将W32Time描述显示为@%SystemRoot%\ system32 \ w32time.dll,-201
如果我理解正确,我需要读取内存中的dll名称并检索存储服务描述的strID?
这对我来说很困惑,如果有人能提供帮助,我将不胜感激。
我只需要获得服务的描述,它肯定不会像这样复杂吗?
谢谢:)
答案 0 :(得分:4)
致电QueryServiceConfig2(你会在那里找到一个C示例)。
无论您需要做什么服务都应该通过Service Manager API来完成。注册表数据应被视为操作系统的“私有”。
答案 1 :(得分:3)
在所有版本的Delphi中,JEDI JCL包含了获取服务的友好描述所需的一切,以及与服务控制API有关的任何其他内容。
单元JclSvcCtrl.pas中的类TJclSCManager包含属性Services,其中包括已注册的每个服务的名称和描述,并且还允许您执行启动,停止,启用和禁用服务等操作。
更新:ldsandon的另一个答案指出,Delphi RTL显然已经在单元WinSvc中的XE2中包含了这个。请参阅下面有关QueryServiceConfig2的答案。感谢ldsandon指出这个事实。
答案 2 :(得分:2)
使用 WMI 是另一种直接使用Windows API的方法,例如借助(免费)API代码生成器
<强> WMI Delphi Code Creator 强>
WMI Delphi Code Creator工具允许您生成Object Pascal 和C ++代码访问WMI(Windows Management Instrumentation) 课程,活动和方法。
答案 3 :(得分:1)
您使用的是Unicode吗? RegLoadMUIString function的评论说只支持Unicode版本。
仅支持Unicode的RegLoadMUIString函数。虽然 声明了此函数的Unicode(W)和ANSI(A)版本, RegLoadMUIStringA函数返回ERROR_CALL_NOT_IMPLEMENTED。 应用程序应显式调用RegLoadMUIStringW或指定 Unicode作为平台调用(PInvoke)调用中的字符集。
您是否尝试过直接致电RegLoadMUIStringW
?
答案 4 :(得分:0)
您还可以查看the GLibWMI library。与WMI一起使用的免费(和包含源代码)库。包含名为 TServiceInfo 的组件。 还包括一个工作wirh服务的演示。
使用此组件,您可以访问Win32_Service类;您可以查看the properties and structure here。
此致