# aardio 范例: main.aardio



```aardio
//RUNAS//
import service
service.serviceName = "testAardioSrv";
 
import fsys.log;
global.onError = function( err,over ){ 
    if(!over){
        import debug;
        var stack = debug.traceback(,"调用栈",3);
    }
    
    fsys.log.print(err);
    if( _STUDIO_INVOKED ) return err; 
}

if( !_STUDIO_INVOKED ){
 
	import service.simpleTool;
	if( service.simpleTool.run(,"Test Aardio Service","这是一个测试服务") ){
		//不是服务进程,可以直接双击运行生成的EXE文件,aardio会自动启动简易版服务管理工具。
		return 0;
	}
	
	//这个函数用于在进程主线程中启动服务，并且会等待所有服务线程执行结束后才会返回
	service.startDispatchThread({
	
    	//可以增加多个服务名与服务线程回调函数的键值对
    	[service.serviceName] = function(serviceName,argv){ //注意此服务回调函数运行于独立线程
       	
        	import service.threads;
        	
        	//服务线程启动后第一件事应当是注册服务控制线程
        	var srvStatus = service.registerCtrlThread(serviceName,service.threads.control)
        	
        	//服务切换到运行状态
        	srvStatus.controlsAccepted = 0x1/*_SERVICE_ACCEPT_STOP*/ 
        	srvStatus.currentState = 0x4/*_SERVICE_RUNNING*/;
        	service.updateStatus(srvStatus,serviceName);
         	
        	//启动服务主线程
        	service.threads.main(serviceName);
        	
        	//原生多线程回调默认不支持 COM 接口，如下创建独立线程可以启用 COM 接口。
        	//thread.invokeEx(service.threads.main,serviceName); 
         	
        	//服务切换到停止状态
        	srvStatus.controlsAccepted = 0;
        	srvStatus.currentState = 0x1/*_SERVICE_STOPPED*/
        	service.updateStatus(srvStatus,serviceName)
    	}
	})
}
else {
	/*
	后台服务可在系统启动时自动运行。
	后台服务程序本质也是一个控制台程序，
	因为后台服务调试不便，开发环境下可以这样启动服务主线程，作为一个普通控制台程序进行调试。 
	
	发布后在服务进程中启动以后,不能在用户桌面上直接显示界面，
	但可以使用 service.msgbox() 等函数在当前用户桌面上显示交互对话框。
	如果需要在桌面显示控制台输出，请在控制面板->管理工具->服务管理器中右键点击注册的服务，属性中勾选：本地系统服务->允许与桌面交互。
	
	编写服务程序,可以调用fsys.log输出日志文件记录运行状态以及错误信息.
	*/
	import service.threads;
    service.threads.main(service.serviceName);
}

```

