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
查看完整版本: 刚学DLLCALL(),从MS网站搬了三个系统服务相关的API,呵呵