asionwu
发表于 2012-3-14 20:15:11
呵呵,路过支持一下
pusofalse
发表于 2012-3-14 20:23:14
真是学习了。刚开始我发现其中的3处错误,分别是:
Local $hSrvState = DllCall($hADVAPI32, 'int', 'QueryServiceStatus', 'handle', $hSrv, 'str', 0)
; 第6行, 'str', 0,应该写成 'ptr', DllStructGetPtr($tServerStatus)
Return $hSrvState
; 第10行,$hSrvState 是QueryServiceStatus的返回值,而非服务的状态,状态信息包含在第2个参数中。
DllCall($hADVAPI32, 'int', 'ControlService', 'handle', $hSrv, '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,$hSrvState是QueryServiceStatus函数的返回值,是个布尔值,只是说明函数是否调用成功的,如果成功,服务的状态信息则包含在第2个参数所指向的SERVICE_STATUS结构中。如果按照楼主兄的写法,那么这个函数功能应该是“判断是否能成功查询服务的状态”,而函数名也应该改为 IsServiceQueryStatusSuccessful。而“判断是否能成功查询服务的状态”,只需在OpenService函数中指定服务名称和SERVICE_QUERY_STATUS 访问权限掩码就可以了,如果OpenService返回一个有效的服务句柄,则说明服务的状态是能够成功查询的,之后对QueryServiceStatus函数的调用也是多余的。
woku2538
发表于 2012-3-14 20:34:05
看看在说。。
jy010
发表于 2012-3-14 22:11:43
还不会dllcall 学下下
Qokelate
发表于 2012-3-15 02:12:33
回复 19# pusofalse
谢谢指出,这几个函数是看着帮助的DLLCALL写的,很多地方还是不明白,我把查询那个函数删除了,以免误导他人,呵呵,停止那个倒是知道那里是状态,不过不知道怎弄,就直接带过了,呵呵
Ycxw2008
发表于 2012-3-15 05:26:40
樓主,我太愛你了,我就喜歡這樣的.万分感谢
风行者
发表于 2012-3-15 06:43:23
回复看一看
lowprofile
发表于 2012-3-15 11:07:18
借鉴下楼主DLLCALL的方法!
bladeace
发表于 2012-3-15 11:15:14
顶顶更健康!
kenan
发表于 2012-3-15 11:17:31
谢谢楼主共享
35888894
发表于 2012-3-15 13:41:44
不知道新版本兼容性怎么样
hnzzlzj
发表于 2012-3-15 16:48:04
看看啥内容?
cfs43210
发表于 2012-3-15 17:00:02
谢谢楼主分享
骗子
发表于 2012-3-15 17:23:08
看到别人源码中油,但是一点都不懂学习一下
itljl
发表于 2012-3-15 19:08:19
收藏了,多谢。
页:
1
[2]
3
4
5
6
7
8
9
10
11