找回密码
 加入
搜索
查看: 4439|回复: 11

[AU3基础] [已解决]读不懂“用纯au3编写的服务程序”,在哪里加上我自己想实现的功能?

 火.. [复制链接]
发表于 2012-5-24 11:37:45 | 显示全部楼层 |阅读模式
本帖最后由 給点阳光 于 2012-5-26 09:52 编辑

服务程序不像普通的用户程序,服务程序需要遵循特定的服务规则。就像用SC命令将Notepad.exe注册为服务再开启一样,会返回“服务没有及时响应(1503)”的错误。
下面的代码没有调用任何第三方,纯AU3实现。以下只是演示了一个合法服务程序的编写,代码不具备任何功能。先编译为exe,再用SC命令将此注册为服务,服务名称用AutoIt3Service,否则下面的代码没有任何意义。用services.msc或sc.exe执行开启、停止等操作,会发现这果真是一个合法服务程序。

#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
Const $hAdvApi32Dll = DllOpen("AdvApi32.dll")
Const $hKernel32Dll = DllOpen("Kernel32.dll")

Const $tagSERVICE_TABLE_ENTRY = "ptr ServiceName;ptr ServiceMain"
Const $tagSERVICE_STATUS = "dword ServiceType;dword CurrentState;dword ControlsAccepted;dword Win32ExitCode;dword ServiceSpecificExitCode;dword CheckPoint;dword WaitHint"

Global $hServiceStatus, $tServiceStatus, $pServiceStatus
Global $hServiceMain, $pServiceMain, $tServiceTable, $pServiceTable
Global $hServiceHandlerEx, $pServiceHandlerEx

$hServiceMain = DllCallbackRegister("_ServiceMain", "none", "dword;ptr")
$pServiceMain = DllCallbackGetPtr($hServiceMain)

$hServiceHandlerEx = DllCallbackRegister("_ServiceHandlerEx", "dword", "dword;dword;ptr;ptr")
$pServiceHandlerEx = DllCallbackGetPtr($hServiceHandlerEx)

$pServiceTable = _ServiceHeapAlloc(32)
$tServiceTable = DllStructCreate($tagSERVICE_TABLE_ENTRY, $pServiceTable)
DllStructSetData($tServiceTable, "ServiceName", $pServiceTable + 16)
DllStructSetData($tServiceTable, "ServiceMain", $pServiceMain)

$tServiceName = DllStructCreate("char ServiceName[16]", $pServiceTable + 16)
DllStructSetData($tServiceName, "ServiceName", "AutoIt3Service")

$tServiceStatus = DllStructCreate($tagSERVICE_STATUS)
$pServiceStatus = DllStructGetPtr($tServiceStatus)
DllStructSetData($tServiceStatus, "ServiceType", 16)
DllStructSetData($tServiceStatus, "ControlsAccepted", 3)

_StartServiceCtrlDispatcher($pServiceTable)


Func _StartServiceCtrlDispatcher($pServiceTable)
        Local $iResult
        $iResult = DllCall($hAdvApi32Dll, "int", "StartServiceCtrlDispatcher", "ptr", $pServiceTable)
        Return SetError(_ServiceLastError(), 0, $iResult[0])
EndFunc        ;==>_StartServiceCtrlDispatcher

Func _SetServiceStatus($hServiceStatus, $pServiceStatus)
        Local $iResult
        $iResult = DllCall($hAdvApi32Dll, "int", "SetServiceStatus", "hWnd", $hServiceStatus, _
                        "ptr", $pServiceStatus)
        Return SetError(_ServiceLastError(), 0, $iResult[0])
EndFunc        ;==>_SerServiceStatus

Func _RegisterServiceCtrlHandlerEx($sServiceName, $pHandlerEx, $pContext = 0)
        Local $iResult
        $iResult = DllCall($hAdvApi32Dll, "hWnd", "RegisterServiceCtrlHandlerEx", _
                        "str", $sServiceName, "ptr", $pHandlerEx, "ptr", $pContext)
        Return SetError(_ServiceLastError(), 0, $iResult[0])
EndFunc        ;==>_RegisterServiceCtrlHandlerEx

Func _ServiceHandlerEx($iRequest, $iEventType, $pEventData, $pContext)
        Switch $iRequest
        Case 1
                DllStructSetData($tServiceStatus, "CurrentState", 1)
                _SetServiceStatus($hServiceStatus, $pServiceStatus)
                Return 0
        Case 2
                DllStructSetData($tServiceStatus, "CurrentState", 7)
                _SetServiceStatus($hServiceStatus, $pServiceStatus)
                Return 0
        Case 3
                DllStructSetData($tServiceStatus, "CurrentState", 5)
                _SetServiceStatus($hServiceStatus, $pServiceStatus)
                Sleep(5000)
                DllStructSetData($tServiceStatus, "CurrentState", 4)
                _SetServiceStatus($hServiceStatus, $pServiceStatus)
                Return 0
        Case 4
                _SetServiceStatus($hServiceStatus, $pServiceStatus)
                Return 0
        EndSwitch
EndFunc        ;==>_ServiceHandlerEx

Func _ServiceHeapAlloc($iSize, $iFlags = 8)
        If $iSize < 1 Then Return SetError(87, 0, 0)

        Local $hHeap, $iResult

        $hHeap = DllCall($hKernel32Dll, "hWnd", "GetProcessHeap")
        $iResult = DllCall($hKernel32Dll, "ptr", "HeapAlloc", "hWnd", $hHeap[0], _
                        "dword", $iFlags, "dword", $iSize)
        Return $iResult[0]
EndFunc        ;==>_ServiceHeapAlloc

Func _ServiceHeapFree(ByRef $pBuffer)
        If $pBuffer = 0 Then Return SetError(87, 0, 0)

        Local $iResult, $hHeap
        $hHeap = DllCall($hKernel32Dll, "hWnd", "GetProcessHeap")
        $iResult = DllCall($hKernel32Dll, "int", "HeapFree", "hWnd", $hHeap[0], _
                        "dword", 0, "ptr", $pBuffer)
        If $iResult[0] Then $pBuffer = 0
        Return $iResult[0]
EndFunc        ;==>_ServiceHeapFree

Func _ServiceHeapSize(ByRef $pBuffer)
        If $pBuffer = 0 Then Return SetError(87, 0, 0)

        Local $iResult, $hHeap
        $hHeap = DllCall($hKernel32Dll, "hWnd", "GetProcessHeap")
        $iResult = DllCall($hKernel32Dll, "int", "HeapSize", "hWnd", $hHeap[0], _
                        "dword", 0, "ptr", $pBuffer)
        Return $iResult[0]
EndFunc        ;==>_ServiceHeapFree

Func _ServiceLastError()
        Local $iResult
        $iResult = DllCall($hKernel32Dll, "dword", "GetLastError")
        Return $iResult[0]
EndFunc        ;==>_ServiceLastError

Func _ServiceMain($iNumberofArgs, $pArgs)
        $hServiceStatus = _RegisterServiceCtrlHandlerEx("AutoIt3Service", $pServiceHandlerEx)

        DllStructSetData($tServiceStatus, "CurrentState", 4)
        _SetServiceStatus($hServiceStatus, $pServiceStatus)
EndFunc        ;==>_ServiceMain



原来论坛已有人提过这样的问题,http://www.autoitx.com/forum.php ... E%CE%F1%B3%CC%D0%F2

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-5-24 11:59:15 | 显示全部楼层
gi me rrrwq d wdt wftc
发表于 2012-5-24 15:58:42 | 显示全部楼层
回复 1# 給点阳光
lz确定这代码是全的?
发表于 2012-5-24 16:24:36 | 显示全部楼层
谁知道你想在哪里加,你想干什么?
 楼主| 发表于 2012-5-25 10:38:28 | 显示全部楼层
回复  給点阳光
lz确定这代码是全的?
netegg 发表于 2012-5-24 15:58


代码肯定正确,编译后的文件可以设为服务,我试过,只是这段程序并不实现具体功能,我希望可以改造一下,将自己想实现的功能加进去。
发表于 2012-5-25 12:40:28 | 显示全部楼层
回复 5# 給点阳光
那你到底要加入什么功能呢?还保密啊?
发表于 2012-5-25 17:55:09 | 显示全部楼层
P版为人解答过这个问题,你搜论坛了吗?
发表于 2012-5-25 19:03:08 | 显示全部楼层
回复 4# haijie1223


    果断锤死!
发表于 2012-5-25 20:51:35 | 显示全部楼层
回复 8# 魔导


    难得你还记得这句话。。。

评分

参与人数 1金钱 +10 收起 理由
魔导 + 10 记忆犹新~~~

查看全部评分

 楼主| 发表于 2012-5-26 09:46:41 | 显示全部楼层
P版为人解答过这个问题,你搜论坛了吗?
502762378 发表于 2012-5-25 17:55


好像是有,可惜我阅读权限不够。
发表于 2012-7-3 16:23:38 | 显示全部楼层
看下P版示例也搞不成
发表于 2012-7-4 16:54:21 | 显示全部楼层
看下P版示例也搞不成
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-30 07:29 , Processed in 0.087086 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表