关于Windows服务的编程方法Word文档下载推荐.docx

上传人:b****7 文档编号:22722601 上传时间:2023-02-05 格式:DOCX 页数:27 大小:20.37KB
下载 相关 举报
关于Windows服务的编程方法Word文档下载推荐.docx_第1页
第1页 / 共27页
关于Windows服务的编程方法Word文档下载推荐.docx_第2页
第2页 / 共27页
关于Windows服务的编程方法Word文档下载推荐.docx_第3页
第3页 / 共27页
关于Windows服务的编程方法Word文档下载推荐.docx_第4页
第4页 / 共27页
关于Windows服务的编程方法Word文档下载推荐.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

关于Windows服务的编程方法Word文档下载推荐.docx

《关于Windows服务的编程方法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《关于Windows服务的编程方法Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。

关于Windows服务的编程方法Word文档下载推荐.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1