关于Windows服务的编程方法Word文档下载推荐.docx
- 文档编号:22722601
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:27
- 大小:20.37KB
关于Windows服务的编程方法Word文档下载推荐.docx
《关于Windows服务的编程方法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《关于Windows服务的编程方法Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
main函数。
在服务控制管理器开始一个服务程序时,会等待StartServiceCtrlDispatcher函数的执行。
如果服务类型是SERVICE_WIN32_OWN_PROCESS就会立即调用StartServiceCtrlDispatcher函数的执行;
如
果服务类型是SERVICE_WIN32_SHARE_PROCESS,通常在初始化所有服务之后再调用它。
StartServiceCtrlDispatcher这个函数的作用就是把服务入口点函数和SCM连接起来。
服务ServiceMain函数:
函数ServiceMain是服务的入口点。
在服务控制程序请求一个新的服务启动时,
服务控制管理器启动一个服务,并发送一个开始请求到控制调度程序,而后控制调度程序创建一个新线
程来执行ServiceMain函数。
ServiceMain须执行以下的任务:
调用RegisterServiceCtrlHandler函数注
册一个HandlerEx函数来向服务发送控制请求信息,返回值是服务状态句柄用来向服务控制管理器传送服
务状态。
初始化后调用SetServiceStatus函数设置服务状态为SERVICE_RUNNING。
最后,就是执行服务所
要完成的任务。
服务ControlHandler函数:
每个服务都有一个控制句柄HandlerEx函数。
它会在服务进程从服务控制程
序接收到一个控制请求时被控制调度程序所调用。
无论何时在HandlerEx函数被调用时,都要调用
SetServiceStatus函数向服务控制管理器报告它当前的状态。
在用户关闭系统时,所有的控制句柄都会
调用带有SERVICE_ACCEPT_SHUTDOW控制代码的SetServiceStatus函数来接收NSERVICE_CONTROL_SHUTDOWN
控制代码。
这里是一个Serviceprogram的例子:
实现的功能就是打开一个端口一直监听,连接上来之后,发送一串数据,然后关闭连接。
#include"
Afxwin.h"
windows.h"
stdio.h"
winsock2.h"
#pragmacomment(lib,"
ws2_32"
)
HANDLEhMutex;
SERVICE_STATUSServiceStatus;
SERVICE_STATUS_HANDLEServiceStatusHandle;
//ServiceControlHandlerFunction
voidWINAPICmdControl(DWORDdwCode)
{
switch(dwCode)
{
caseSERVICE_CONTROL_PAUSE:
ServiceStatus.dwCurrentState=SERVICE_PAUSED;
break;
caseSERVICE_CONTROL_CONTINUE:
ServiceStatus.dwCurrentState=SERVICE_RUNNING;
caseSERVICE_CONTROL_STOP:
WaitForSingleObject(hMutex,INFINITE);
ServiceStatus.dwCurrentState=SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode=0;
ServiceStatus.dwCheckPoint=0;
ServiceStatus.dwWaitHint=0;
if(SetServiceStatus(ServiceStatusHandle,&
ServiceStatus)==0)
printf("
SetServiceStatusinCmdControlinSwitchError!
\n"
);
}
return;
caseSERVICE_CONTROL_INTERROGATE:
default:
SetServiceStatusinCmdControloutSwitchError!
}
listenPort()
WSADATAwsa;
SOCKETsServer;
SOCKETsClient;
structsockaddr_insin;
WSAStartup(MAKEWORD(2,2),&
wsa);
sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sServer==INVALID_SOCKET)
SocketError!
return-1;
sin.sin_family=AF_INET;
sin.sin_port=htons(20540);
sin.sin_addr.S_un.S_addr=INADDR_ANY;
if(bind(sServer,(conststructsockaddr*)&
sin,sizeof(sin))==SOCKET_ERROR)
BindError!
if(listen(sServer,5)==SOCKET_ERROR)
ListenError!
hMutex=CreateMutex(NULL,FALSE,NULL);
if(hMutex==NULL)
CreateMutexError!
while
(1)
sClient=accept(sServer,NULL,NULL);
send(sClient,"
aa"
sizeof("
),0);
closesocket(sClient);
Sleep(1000);
WSACleanup();
//ServiceServiceMainFunction
voidWINAPICmdStart(DWORDdwArgc,LPTSTR*lpArgv)
ServiceStatus.dwServiceType=SERVICE_WIN32;
ServiceStatus.dwCurrentState=SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP
|SERVICE_ACCEPT_PAUSE_CONTINUE;
ServiceStatus.dwServiceSpecificExitCode=0;
ServiceStatusHandle=RegisterServiceCtrlHandler("
ntkrnl"
CmdControl);
//注册控制响应
程序
if(ServiceStatusHandle==0)
RegisterServiceCtrlHandlerError!
SetServiceStatusinCmdStartError!
listenPort();
intmain()
SERVICE_TABLE_ENTRYDispatchTable[]=
{"
CmdStart},
{NULL,NULL}
};
StartServiceCtrlDispatcher(DispatchTable);
//注意:
CmdStart函数
return0;
ServiceConfigurationPrograms:
其作用有两个方面,第一是创建、删除和枚举服务,第二是用来更
改或者查询已经安装的服务的信息。
完成这些任务可以直接操作注册表,但是最好还是使用SCM配置函
数。
SCM配置函数需要一个SCManger对象或者一个service对象,要获得这些对象可以使用OpenSCManager函
数,或者使用OpenService、CreateService获得service对象。
这里顺便就把ServiceControlPrograms说了,其实也就是包含一些函数可以控制服务的启动,停止,
相应的函数可以在msdn查询。
下面是一个创建服务的例子,首先使用OpenSCMagenager获得一个SCManger对象,然后使用
CreateService创建一个服务。
Winsvc.h"
TCHAR.h"
Advapi32.lib"
SC_HANDLEschManager;
SC_HANDLEschService;
DWORDdwBytesNeeded;
LPQUERY_SERVICE_CONFIGlpServiceConfig=NULL;
LPSERVICE_DESCRIPTIONlpServiceDescription=NULL;
SERVICE_STATUSServiceStatus;
DWORDdwIndex;
schManager=OpenSCManager
(NULL,NULL,SC_MANAGER_ALL_ACCESS);
//SC_MANAGER_ALL_ACCESS);
if(schManager==NULL)
OpenschManagerError:
%d\n"
GetLastError());
returnFALSE;
SC_HANDLEhdlServ=CreateService(
schManager,
_T("
test"
),
SC_MANAGER_ALL_ACCESS,
0x00000010,
3,
//SERVICE_ALL_ACCESS,
//SERVICE_WIN32_OWN_PROCESS,
//SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
d:
\\test.exe"
),//这个就是由上面那个程序生成的
exe文件
NULL,NULL,NULL,NULL,NULL
);
if(hdlServ==NULL)
DWORDgg=GetLastError();
error!
hdlServ=OpenService(schManager,_T
("
),SC_MANAGER_ALL_ACCESS);
//SERVICE_ALL_ACCESS);
OpenSerivceerror\n"
/*
if(!
DeleteService(hdlServ))
deleteerror\n"
*/
//查看服务状态
SERVICE_STATUSss;
if(QueryServiceStatus(hdlServ,&
ss)==FALSE)
ErrorServiceStatus!
GetLastError());
//如果服务已经启动,则退出
if(ss.dwCurrentState==SERVICE_RUNNING)
returnTRUE;
//启动服务
StartService(hdlServ,0,NULL);
if(ss.dwCurrentState!
=SERVICE_RUNNING)
ErrorinStartingService!
CloseHandle(hdlServ);
\nend\n"
最后,再举一个例子。
ServiceAll()枚举所有的服务,并打印出来
ServiceInformation(char*szServiceName)查询特定服务的具体信息
BOOLServiceAll()
DWORDdwServiceType;
DWORDdwServiceState;
DWORDcbBufSize;
DWORDResumeHandle;
DWORDcbBytesNeeded;
DWORDServicesReturned;
ENUM_SERVICE_STATUSEnumStatus[512];
schManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
dwServiceType=SERVICE_WIN32;
dwServiceState=SERVICE_STATE_ALL;
cbBufSize=sizeof(EnumStatus);
cbBytesNeeded=0;
ServicesReturned=0;
ResumeHandle=0;
if(!
EnumServicesStatus(schManager,dwServiceType,dwServiceState,
EnumStatus,cbBufSize,&
cbBytesNeeded,
&
ServicesReturned,&
ResumeHandle))
cbBufSize+=cbBytesNeeded;
EnumServicesStatusError:
else
Services:
\t%d\n"
ServicesReturned);
\t\t===Services===\n\n"
%-20s\t%-10s%s\n\n"
"
ServiceName"
Status"
DisplayName"
for(dwIndex=0;
dwIndex<
ServicesReturned;
dwIndex++)
%-20s\t"
EnumStatus[dwIndex].lpServiceName);
switch(EnumStatus[dwIndex].ServiceStatus.dwCurrentState)
caseSERVICE_STOPPED:
%-10s"
Stopped"
caseSERVICE_START_PENDING:
Starting"
caseSERVICE_STOP_PENDING:
Stopping"
caseSERVICE_RUNNING:
Running"
caseSERVICE_CONTINUE_PENDING:
Continue"
caseSERVICE_PAUSE_PENDING:
Pausing"
caseSERVICE_PAUSED:
Paused"
"
%s\n"
EnumStatus[dwIndex].lpDisplayName);
\nTotal:
if(schManager!
=NULL)
CloseServiceHandle(schManager);
BOOLServiceInformation(char*szServiceName)
schService=OpenService(schManager,szServiceName,SERVICE_ALL_ACCESS);
if(schService==NULL)
if(GetLastError()==ERROR_INVALID_NAME)
%snoFound!
szServiceName);
OpenServiceError:
lpServiceConfig=(LPQUERY_SERVICE_CONFIG)malloc(1024*8);
\t\t===Configuration===\n\n"
QueryServiceConfig(schService,lpServiceConfig,1024*8,&
dwBytesNeeded))
Qu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 Windows 服务 编程 方法