|
发表于 2012-3-14 20:23:14
|
显示全部楼层
真是学习了。刚开始我发现其中的3处错误,分别是:
Local $hSrvState = DllCall($hADVAPI32, 'int', 'QueryServiceStatus', 'handle', $hSrv[0], 'str', 0)
; 第6行, 'str', 0,应该写成 'ptr', DllStructGetPtr($tServerStatus)
Return $hSrvState[0]
; 第10行,$hSrvState[0] 是QueryServiceStatus的返回值,而非服务的状态,状态信息包含在第2个参数中。
DllCall($hADVAPI32, 'int', 'ControlService', 'handle', $hSrv[0], 'dword', 1, 'str', 1)
; 第18行,'str', 0,应该写为 'ptr', DllStructGetPtr($tServerStatus)
细想之后,发现第3处错误,这样写也是可以的。用ControlService来停止服务,第3个参数应该设为SERVICE_STATUS结构的指针,在成功调用之后,这个结构中将包含一些服务的状态信息。如果不关心这些状态信息,且在调用ControlService函数之前,不必设置结构中某些字段的值,完全可以用'str', '' 来代替'ptr', DllStructGetPtr($tServerStatus)。
但是,第1、2处错误,这样写就完全错了。函数名为GetSrvState,功能是查询服务的状态,你正是需要第2个参数,所以应该将其设为一个有效的SERVICE_STATUS结构的指针。这样写之所以不会出错,是因为Au3内部在判断参数类型为str或wstr时,会自动分配一个有效的缓存区。Return $hSrvState[0],$hSrvState[0]是QueryServiceStatus函数的返回值,是个布尔值,只是说明函数是否调用成功的,如果成功,服务的状态信息则包含在第2个参数所指向的SERVICE_STATUS结构中。如果按照楼主兄的写法,那么这个函数功能应该是“判断是否能成功查询服务的状态”,而函数名也应该改为 IsServiceQueryStatusSuccessful。而“判断是否能成功查询服务的状态”,只需在OpenService函数中指定服务名称和SERVICE_QUERY_STATUS 访问权限掩码就可以了,如果OpenService返回一个有效的服务句柄,则说明服务的状态是能够成功查询的,之后对QueryServiceStatus函数的调用也是多余的。 |
评分
-
查看全部评分
|