发布为 EXE 以后,在桌面上直接双击运行就会显示控制台。 服务进程不能在用户桌面上直接显示界面, 记录运行时数据或错误信息的一些方法:说明
在控制台窗口按 Y 注册系统服务,按 N 卸载系统服务。
操作系统开机就会自动启动注册成功的后台服务。
新系统在 服务管理器中勾选 【允许与桌面交互】 是无效的。
但可以通过 service.msgbox,service.msgboxErr,service.msgboxTest 等函数向用户桌面发送对话框。
NT 服务操作
部分操作需要管理权限
返回操作系统活动用户会话ID,
更多会话控制请参考标准库 win.ts
创建服务,
参数@1可为空,默认使用当前应用程序路径,
其他可选参数未列出请查看函数源码
删除服务
注意删除服务前最好关闭服务管理器
for( serviceName,displayName,svrStatusProcess in service.each()){
io.print(serviceName, displayName,svrStatusProcess.state)
}
for id,station,state in service.eachSession(){
if( state == 0 ) return id;/*遍历操作系统所有登录用户会话,
id 为会话 ID,station 为会话名,state 为会话状态。
state 为 0 表示登录激活状态,1 为已连接,4 为断开状态*/
}
是否存在指定的服务
服务是否正在运行
服务是否已停止
创建管理器
弹出对话框。
返回用户操作 ID,如果不指定超时值则不等待用户操作,并总是返回 32001/*_IDASYNC*/。
超时值以毫秒为单位,超时为 0 表示一直等待,。不指定超时则不等待用户操作。
除参数 @1 以外,其他所有参数可选。
如果参数 @1 是表对象,自动调用 table.tostring 序列化为文本。
参数 @1 是其他类型则调用 tostring 转为字符串。
可选参数 @4 可用字符串或数值指定图标样式(参考 MB 前缀常量值,设为 0 去掉图标与提示音),可选字符串值:
6/*_IDYES*/,7/*_IDNO*/, 2/*_IDCANCEL*/
之一。1/*_IDOK*/,2/*_IDCANCEL*/
之一。弹出错误对话框。
所有者窗口参数可选。
如果参数 @1 是表对象,则自动调用 table.tostring 序列化为文本。
其他类型调用 tostring 转为字符串。
返回布尔值表示用户是否按了“确定”按钮。
标题,所有者窗口参数可选
暂停服务,
成功返回 true ,
失败请使用 lasterr 函数获取错误信息
service.registerCtrlThread( serviceName,function(control,eventType,pEventData){
}
)
重新启动服务,成功返回 true ,
超时以秒为单位,省略则不限时间等待操作完成
停止超时达到时间后服务未正常停止则强制中断服务进程
暂停状态恢复运行,
成功返回 true ,
失败请使用 lasterr 函数获取错误信息
当前服务线程中运行的 NT 服务名,
主线程应自行指定
返回操作系统所有登录用户会话,
更多会话控制请参考标准库 win.ts
启动服务,
成功返回 true,
失败请使用 lasterr 函数获取错误信息
service.service.startDispatchThread(
服务名 = function(serviceName,argv){
import service;
var srvStatus = service.registerCtrlThread(serviceName,function(control,eventType,pEventData){
import service;
if( control == 0x1/*_SERVICE_CONTROL_STOP*/ ){
service.updateStatus({currentState = 0x1/*_SERVICE_STOPPED*/},owner.serviceName);
}
} )
srvStatus.controlsAccepted = 0x1/*_SERVICE_ACCEPT_STOP*/
srvStatus.currentState = 0x4/*_SERVICE_RUNNING*/;
service.updateStatus(srvStatus,serviceName)
/*服务运行代码*/
srvStatus.controlsAccepted = 0;
srvStatus.currentState = 0x1/*_SERVICE_STOPPED*/
service.updateStatus(srvStatus,serviceName)
}
)
停止服务,
成功返回 true ,
失败请使用 lasterr 函数获取错误信息
停止服务,如果失败就强制中断服务进程,
成功返回 true ,
失败请使用 lasterr 函数获取错误信息
强制中断服务进程,
成功返回 true ,
参数@1应是registerCtrlHandler函数的返回值,
在CtrlHandler函数中指定部分需要更新的值即可
binaryPathName
dependencies
displayName
errorControl
loadOrderGroup
serviceStartName
serviceType
startType
tagId
修改配置,其他可选参数未列出请查看函数源码
修改配置
配置值必须是结构体
修改服务说明
关闭
控制服务
创建服务,其他可选参数未列出请查看函数源码
删除服务
注意删除服务前最好关闭服务管理器
for(serviceName,displayName,serviceStatus in ntsrvmgrObject.eachDependent("/*指定服务名列出依赖此服务的服务*/") ){
}
是否存在指定的服务
服务是否正在运行
服务是否已停止
打开服务句柄
暂停服务,
成功返回 true ,
失败请使用 lasterr 函数获取错误信息
返回启动路径以及参数
返回配置
获取配置
配置值必须是结构体
返回服务说明
成功返回一个表示服务状态的表对象
暂停状态恢复运行,
成功返回 true ,
失败请使用 lasterr 函数获取错误信息
启动服务,
成功返回 true ,
失败请使用 lasterr 函数获取错误信息
启动服务并等待服务进程切换到运行状态,
返回打开的进程对象(process 对象),可选用参数@2指定进程访问权限
设置为自动启动
设置为延时启动
设置为禁用
设置为手动启动
停止服务,
成功返回 true ,
失败请使用 lasterr 函数获取错误信息
停止服务,如果失败就强制中断服务进程,
成功返回 true ,
失败请使用 lasterr 函数获取错误信息
强制中断服务进程,
成功返回 true ,
等待服务切换到指定状态
状态码不指定时默认为 4/*_SERVICE_RUNNING*/
成功返回一个表示服务状态的表对象
checkPoint
controlsAccepted
currentState
processId
processId
serviceSpecificExitCode
serviceType
state
waitHint
win32ExitCode
_SERVICE_ACCEPT_HARDWAREPROFILECHANGE=0x20
_SERVICE_ACCEPT_NETBINDCHANGE=0x10
_SERVICE_ACCEPT_PARAMCHANGE=8
_SERVICE_ACCEPT_PAUSE_CONTINUE=2
_SERVICE_ACCEPT_POWEREVENT=0x40
_SERVICE_ACCEPT_SESSIONCHANGE=0x80
_SERVICE_ACCEPT_SHUTDOWN=4
_SERVICE_ACCEPT_STOP=1
_SERVICE_ACTIVE=1
_SERVICE_ADAPTER=4
_SERVICE_AUTO_START=2
_SERVICE_BOOT_START=0
_SERVICE_CHANGE_CONFIG=2
_SERVICE_CONTINUE_PENDING=5
_SERVICE_CONTROL_CONTINUE=3
_SERVICE_CONTROL_HARDWAREPROFILECHANGE=0xC
_SERVICE_CONTROL_INTERROGATE=4
_SERVICE_CONTROL_NETBINDADD=7
_SERVICE_CONTROL_NETBINDDISABLE=0xA
_SERVICE_CONTROL_NETBINDENABLE=9
_SERVICE_CONTROL_NETBINDREMOVE=8
_SERVICE_CONTROL_PARAMCHANGE=6
_SERVICE_CONTROL_PAUSE=2
_SERVICE_CONTROL_POWEREVENT=0xD
_SERVICE_CONTROL_SESSIONCHANGE=0xE
_SERVICE_CONTROL_SHUTDOWN=5
_SERVICE_CONTROL_STOP=1
_SERVICE_DEMAND_START=3
_SERVICE_DISABLED=4
_SERVICE_FILE_SYSTEM_DRIVER=2
_SERVICE_INACTIVE=2
_SERVICE_INTERROGATE=0x80
_SERVICE_KERNEL_DRIVER=1
_SERVICE_PAUSED=7
_SERVICE_PAUSE_CONTINUE=0x40
_SERVICE_PAUSE_PENDING=6
_SERVICE_RECOGNIZER_DRIVER=8
_SERVICE_RUNNING=4
_SERVICE_RUNS_IN_SYSTEM_PROCESS=1
_SERVICE_START_PENDING=2
_SERVICE_STOPPED=1
_SERVICE_STOP_PENDING=3
_SERVICE_SYSTEM_START=1
_SERVICE_USER_DEFINED_CONTROL=0x100
_SERVICE_WIN32=0x30
_SERVICE_WIN32_OWN_PROCESS=0x10
_SERVICE_WIN32_SHARE_PROCESS=0x20