分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
转载请标明是引用于 http://blog.csdn.net/chenyujing1234
一、演示过程
下方代码演示了如何使用vs(C/C++)创建windows服务程序
工程文件下载地址: http://download.csdn.net/download/sooth2008/2759082
使用visual studio创建一个win32控制台应用程序,编译后就OK了。
然后开始->运行->cmd->回车,输入 sc create test binPath= 编译成功后的可执行文件的路径回车就创建了一个服务.
注意这里的格式,“=”后面是必须空一格的,否则会出现错误。
然后开始->运行->services.msc->回车就可以看到刚刚创建的服务了。
描述:
SC 是用于与服务控制管理器和服务进行通信的命令行程序。
用法:
sc <server> [command] [service name] <option1> <option2>...
选项 <server> 的格式为 "\\ServerName"
键入 "sc [command]" 可以获得有关命令的进一步帮助
命令:
query-----------查询服务的状态,
或枚举服务类型的状态。
queryex---------查询服务的扩展状态,
或枚举服务类型的状态。
start-----------启动服务。
pause-----------向服务发送 PAUSE 控制请求。
interrogate-----向服务发送 INTERROGATE 控制请求。
continue--------向服务发送 CONTINUE 控制请求。
stop------------向服务发送 STOP 请求。
config----------更改服务的配置(永久)。
description-----更改服务的描述。
failure---------更改服务失败时执行的操作。
failureflag-----更改服务的失败操作标志。
sidtype---------更改服务的服务 SID 类型。
privs-----------更改服务的所需权限。
qc--------------查询服务的配置信息。
qdescription----查询服务的描述。
qfailure--------查询失败时服务执行的操作。
qfailureflag----查询服务的失败操作标志。
qsidtype--------查询服务的服务 SID 类型。
qprivs----------查询服务的所需权限。
delete----------(从注册表)删除服务。
create----------创建服务(将其添加到注册表)。
control---------向服务发送控制。
sdshow----------显示服务的安全描述符。
sdset-----------设置服务的安全描述符。
showsid---------显示相应于假定名称的 SID 字符串。
GetDisplayName--获取服务的 DisplayName。
GetKeyName------获取服务的 ServiceKeyName。
EnumDepend------枚举服务的依存关系。
示例:
sc start MyService
----------------------------------
实际上sc所完成的功能就是“控制面板.管理工具”中看到的“服务”完成的功能。
在命令行中输入下面的命令,可以看到详细语法:
----------------------------------
sc config hlep
----------------------------------
sc config 服务名 start= AUTO (自动)
sc config 服务名 start= DEMAND (手动)
sc config 服务名 start= DISABLED(禁用)
注意:等号后面必须有一个空格。
1、启动服务:
右键点击->启动 大功告成。(或者在提示建立成功后,可以直接输入“net start Test” 来启动服务)
此时可以在任务栏管理器中看到这个exe在运行。
PS:该服务每隔5秒往d:/test.txt 写入一条记录你的代码就应该加在srv_core_thread中,当然你也可以添加多个类似srv_core_thread的线程.
在服务停止时我们可以看到D:\下生成了test.txt文档
2、停止服务
3、删除服务 :
在 "开始->运行->cmd" 中输入 sc delete TEST
此时虽然把服务删除了,但是从->services.msc->还是可以看到test服务的状态不审“已经启动".
任务栏管理器上还是有此进程的存在。
4、
这样在开机会会自动启动此服务,经实验,在XP开机弹出登陆框时,服务已经启动了。
问题:何时加载这些服务?
答: 请参照我的文章:<<Winlogon、LSASS、Userinit>>
里面有这样一句“winlogon创建服务控制管理器(SCM)进程(\windows\system32\Services.exe),而SCM进程又依次加载所有被标记为自动-启动斩服务和设备驱动程序”。
5、在服务启动时弹出窗口
- void WINAPI service_main(int argc, char** argv)
- {
- ServiceStatus.dwServiceType = SERVICE_WIN32;
- ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
- ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwServiceSpecificExitCode = 0;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- hServiceStatusHandle = RegisterServiceCtrlHandler(_T(SERVICE_NAME), ServiceHandler);
- if (hServiceStatusHandle==0)
- {
- DWORD nError = GetLastError();
- }
- ::MessageBox(NULL, L"Service test start Ok", L"OK", MB_OK);
运行时出现提示:
6、脚本启动服务
打开一个Txt,写上下面的内容,保存“服务名.bat”文
:启动服务名
echo 启动服务名
net start 服务名
pause
关闭也一样(打开一个Txt,写上下面的内容,保存“服务名.bat”文件):
:关闭服务名
echo 关闭服务名
net stop 服务名
pause
- @echo off
- sc.exe create test type= own type= interact start= auto binPath= %CD%\test.exe
二、代码
1、不加服务事件
- /*******************************************************************************
- Written by: shiyang sun
- First: you can used this code free,absolutely free!
- Second:of course,you can remove this header unconstrained!
- but this header might useful if you sometimes want to kick my ass or praise me.
- Copyright:none
- Get more message on:http://blog.sina.com.cn/lipfreedom
- Address:sunshiyang shenzhen city guangdong province china
- E-mail:[email protected]
- Create date:2010/10/14
- ********************************************************************************/
- #include "stdafx.h"
- #include "Windows.h"
- #define SERVICE_NAME "srv_demo"
- SERVICE_STATUS ServiceStatus;
- SERVICE_STATUS_HANDLE hServiceStatusHandle;
- void WINAPI service_main(int argc, char** argv);
- void WINAPI ServiceHandler(DWORD fdwControl);
- TCHAR szSvcName[80];
- SC_HANDLE schSCManager;
- SC_HANDLE schService;
- int uaquit;
- FILE* log;
- DWORD WINAPI srv_core_thread(LPVOID para)
- {
- int i = 0;
- for(;;)
- {
- if(uaquit)
- {
- break;
- }
- fprintf(log,"srv_core_thread run time count:%d\n",i++);
- Sleep(5000);
- }
- return NULL;
- }
- void WINAPI ServiceHandler(DWORD fdwControl)
- {
- switch(fdwControl)
- {
- case SERVICE_CONTROL_STOP:
- case SERVICE_CONTROL_SHUTDOWN:
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwCurrentState = SERVICE_STOPPED;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- uaquit= 1;
- //add you quit code here
- if(log != NULL)
- fclose(log);
- break;
- default:
- return;
- };
- if (!SetServiceStatus(hServiceStatusHandle, &ServiceStatus))
- {
- DWORD nError = GetLastError();
- }
- }
- void WINAPI service_main(int argc, char** argv)
- {
- ServiceStatus.dwServiceType = SERVICE_WIN32;
- ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
- ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwServiceSpecificExitCode = 0;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- hServiceStatusHandle = RegisterServiceCtrlHandler(_T(SERVICE_NAME), ServiceHandler);
- if (hServiceStatusHandle==0)
- {
- DWORD nError = GetLastError();
- }
- //add your init code here
- log = fopen("d:\\test.txt","w");
- //add your service thread here
- HANDLE task_handle = CreateThread(NULL,NULL,srv_core_thread,NULL,NULL,NULL);
- if(task_handle == NULL)
- {
- fprintf(log,"create srv_core_thread failed\n");
- }
- // Initialization complete - report running status
- ServiceStatus.dwCurrentState = SERVICE_RUNNING;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 9000;
- if(!SetServiceStatus(hServiceStatusHandle, &ServiceStatus))
- {
- DWORD nError = GetLastError();
- }
- }
- //do not change main function
- int main (int