卫和谐
发表于 2011-5-19 17:08:05
服务要与scm(services.exe)通讯,如果缺少这部份就会出现不可控制,就如LZ你前面说的“没有及时响应启动或控制 ...
ceoguang 发表于 2011-5-19 10:57 http://www.autoitx.com/images/common/back.gif
服务要与scm(services.exe)通讯
这个如何做?
允许与桌面交互
这个已经设置了!
卫和谐
发表于 2011-5-20 21:07:58
没有帮助解决这个问题的吗?
ceoguang
发表于 2011-5-20 21:37:17
http://www.autoitx.com/forum.php?mod=viewthread&tid=10770&rpid=133709&ordertype=0&page=1#pid133709
卫和谐
发表于 2011-5-21 06:44:44
P版这个不是我所需要的,
我将程序注册成服务后,开机时可以正常启动,但启动后约10秒后会自动退出,难道服务不能够支持有界面的程序?????????????
tigercc99
发表于 2011-5-21 10:54:19
看看学历了!
tigercc99
发表于 2011-5-21 10:58:18
看看学历了!
卫和谐
发表于 2011-5-22 05:44:13
希望有人继续给出解决办法!
m765555
发表于 2011-5-22 08:28:06
应该是代码的问题吧,我以前做的服务就没有这种现象。
卫和谐
发表于 2011-5-24 12:46:27
回复 23# m765555
代码没有问题,服务可以正常启动只是会自己中断~!
wsfda
发表于 2011-5-24 14:48:09
回复 19# 卫和谐
还是那句话,肯定是不符合规则,所以会启动后不到十秒自动停止,我也测试了,不是任何一个exe文件都可以作为服务器启动,切一直正常循环运行的
请教P版吧,或者好好看看P版的关于服务的代码
wsfda
发表于 2011-5-24 14:52:47
回复 1# 卫和谐
在基于Nt的系统中,全部服务任务都是由服务控制管理器(SCM)系统管理。SCM维持注册表中已知服务列表,打开各项服务(即可以是开机时自动打开,也可以使用户请求打开)。SCM把服务列表和它们的打开状态保存在注册表中,新服务项在安装时加入此列表中。另外也可以删除服务项目。
作为服务任务的程序是一个普通的exe文件,但是必须满足特定的要求才能确切地与SCM连接。微软已经详细编制了这些函数的程序流,必须紧密依据此流程表,否则服务项目就不能运行。要求如下:
1.服务项目的exe文件必须有一个普通的main或WinMain函数,此函数必须立即(特定情况下是在30秒之内)调用函数StartServiceCrtlDispatcher。调用之后,EXE文件就在SCM中注册,并且给出一个调用函数ServiceMain(在启动服务时调用)的指针。可以更改函数ServiceMain的函数名,然后就能在ServiceMain下面的记录文本中找到所用函数名的描述。main函数应该在注册ServiceMain之后返回。
不能用命令行方式运行服务的exe文件。而应该在SCM知道的服务列表中安装,SCM会调用main函数,打开EXE文件。偶然用命令行方式执行服务时一定会出错,因为它不能连接SCM。
2.SCM在打开服务时将调用函数ServiceMain。例如,当管理员选择“控制面板”上“服务”的start按钮时,SCM将在一个工作线程中执行函数ServiceMain。
函数ServiceMain完成多项工作。其中最为主要的是立即调用函数RegisterServiceCtrlHandler,该函数能用SCM注册一个函数Handler以调用控制要求。此函数的函数名可以随便更改,但大会在Handler下面的记录文本中列出。函数RegisterServiceCtrlHandler返回一个句柄,服务在给SCM发送状态信息时将用到该句柄。
函数ServiceMain还开始将完成实际服务任务的工作现程。一旦线程开始,函数ServiceMain就等待一个事件的发生。直道服务停止,函数ServiceMain才返回。之后,重新调用函数ServiceMain,SCM将重新开始该项服务。
3.函数Handler包含一个转换语句,用于分析来自SCM的控制请求。默认时,SCM发送以下控制常数:
SERVICE_CONTROL_STOP 通知服务停止
SERVICE_CONTROL_PAUSE 通知服务暂停
SERVICE_CONTROL_CONTINUE 通知服务重新开始
SERVICE_CONTROL_INTERROGATE 通知服务立即报告当前状态
SERVICE_CONTROL_SHUTDOWN 通知服务紧急关闭
用户也可以创建自定义常数(128~255之间),通过SCM把它们发送到服务项。
当创建一个包含上述main、ServiceMain和Handler等函数的EXE文件以及一个包含服务线程的函数时,就得到了一个完整的服务任务。
请参考,我本人不是很懂
wsfda
发表于 2011-5-24 15:32:15
同时希望和谐兄弟早日解决这个问题, 因为这个问题好像很多人需要,我也需要,搞定后上来分享下啊
charles
发表于 2011-5-24 17:00:02
路过观望学习~~
卫和谐
发表于 2011-5-24 20:38:49
回复 27# wsfda
也不太明白,下面是我通过注册表添加服务的代码,有识之士请指教:;注册服务
Func Installserver()
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit')
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit', 'Type', 'REG_DWORD', '0x00000110')
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit', 'Start', 'REG_DWORD', '0x00000002')
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit', 'ErrorControl', 'REG_DWORD', '0x00000001')
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit', 'ImagePath', 'REG_EXPAND_SZ', @ScriptFullPath)
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit', 'DisplayName', 'REG_SZ', @ScriptName)
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit', 'ObjectName', 'REG_SZ', 'LocalSystem')
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit', 'Description', 'REG_SZ', '防止上网沉迷系统')
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit\Enum')
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit\Enum', '0', 'REG_SZ', 'Root\LEGACY_PCLIMIT\0000')
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit\Enum', 'Count', 'REG_DWORD', '0x00000001')
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcLimit\Enum', 'NextInstance', 'REG_DWORD', '0x00000001')
EndFunc ;==>Installserver
wsfda
发表于 2011-5-24 21:01:14
回复 29# 卫和谐
这个周末也好好研究研究,大家一起加油,OK了都上来分享啊
你的服务是注册成功了,关键还是exe程序...我也去再研究研究