欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    WIN系统服务编程.ppt

    • 资源ID:6523784       资源大小:701.50KB        全文页数:79页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    WIN系统服务编程.ppt

    ,Windows系统编程实用教程,授课教师:职务:,第9章 Windows服务编程,课程描述Windows服务是长期在后台运行、不与用户进行交互的程序。在C/S结构的应用程序中通常可以服务的形式开发服务器程序。有的应用程序中还需要检测和控制服务的状态。本章将介绍Windows服务编程的基本方法。,本章知识点,9.1 Windows服务的概念和管理9.2 Windows服务编程9.3 开发Windows服务程序9.4 增加和使用组件,9.1 Windows服务的概念和管理,9.1.1 管理Windows服务9.1.2 服务控制器,9.1.1 管理Windows服务,服务的属性对话框,命令行工具sc.exe,sc command service name.参数说明如下:,指定要连接的计算机,格式为“”。command,指定对服务进行的操作,具体如下:query,查询服务的状态或枚举服务类型的状态。queryex,查询服务的扩展状态或枚举服务类型的状态。start,启动服务。pause,向服务发送 PAUSE 控制请求。interrogat,-向服务发送 INTERROGATE 控制请求。continue,向服务发送 CONTINUE 控制请求。stop,向服务发送 STOP 请求。config,永久更改服务的配置。description,更改服务的描述。failure,更改服务失败时所进行的操作sidtype,更改服务的服务 SID 类型。qc,查询服务的配置信息。qdescription,查询服务的描述。,接上,qfailure,查询服务失败时所进行的操作qsidtype,查询服务的服务 SID 类型。delete,从注册表中删除服务。create,创建服务(将其添加到注册表)control,向服务发送控制。sdshow,显示服务的安全描述符。sdset,设置服务的安全描述符。showsid,显示与任意名称相对应的服务 SID。GetDisplayName,获取服务的显示名称。GetKeyName,获取服务的键名。EnumDepend,枚举服务的依存关系。service name,指定要操作的服务名。,【例9.1】,使用sc命令查询服务MySQL的状态,命令如下:sc query MySQL,【例9.2】,使用sc命令停止服务MySQL的状态,命令如下:sc stop MySQL,9.1.2 服务控制器,服务控制器(Service Control Manager,SCM)是Windows NT家族操作系统中的一个系统进程,它可以启动、停止Windows服务,并与Windows服务交流。服务控制器对应的可执行文件是%SystemRoot%services.exe,它以Windows控制台程序的形式运行。,注册表中关于服务的内容,注册表中服务包含的键值,9.2 Windows服务编程,9.2.1 与SCM建立连接9.2.2 创建服务9.2.3 打开服务9.2.4 枚举服务列表9.2.5 启动服务9.2.6 停止服务9.2.7 查询服务的状态9.2.8 修改服务的配置参数,9.2.1 与SCM建立连接,SC_HANDLE WINAPI OpenSCManager(_in LPCTSTR lpMachineName,/指定要连接的目标计算机,如果为NULL或空字符串,则连接到本地计算机 _in LPCTSTR lpDatabaseName,/要连接的服务控制器名字,应使用SERVICES_ACTIVE_DATABASE。如果使用NULL,则表示连接的默认服务控制器 _in DWORD dwDesiredAccess/指定对服务控制器的访问权限);,9.2.2 创建服务,SC_HANDLE WINAPI CreateService(_in SC_HANDLE hSCManager,_in LPCTSTR lpServiceName,_in LPCTSTR lpDisplayName,_in DWORD dwDesiredAccess,_in DWORD dwServiceType,_in DWORD dwStartType,_in DWORD dwErrorControl,_in LPCTSTR lpBinaryPathName,_in LPCTSTR lpLoadOrderGroup,_out LPDWORD lpdwTagId,_in LPCTSTR lpDependencies,_in LPCTSTR lpServiceStartName,_in LPCTSTR lpPassword);,【例9.3】,编写程序,将其自身安装为Windows服务。自定义函数SvcInstall()用于安装服务,代码如下:#include stdafx.h#include#include#define SVCNAME TEXT(SvcName)VOID SvcInstall()SC_HANDLE schSCManager;SC_HANDLE schService;TCHAR szPathMAX_PATH;/获取当前程序的可执行文件的路径 if(!GetModuleFileName(NULL,szPath,MAX_PATH)printf(Cannot install service(%d)n,GetLastError();return;,接上,/获取服务控制器数据库句柄 schSCManager=OpenSCManager(NULL,/本地计算机 NULL,/使用缺省的数据库 SC_MANAGER_ALL_ACCESS);/使用全部访问权限 if(NULL=schSCManager)printf(OpenSCManager failed(%d)n,GetLastError();return;/安装服务 schService=CreateService(schSCManager,/服务控制器数据库句柄 SVCNAME,/服务名 SVCNAME,/服务显示名,接上,SERVICE_ALL_ACCESS,/使用全部访问权限 SERVICE_WIN32_OWN_PROCESS,/服务类型为在其自己的进程中运行的服务 SERVICE_DEMAND_START,/启动类型 SERVICE_ERROR_NORMAL,/错误控制类型 szPath,/服务可执行文件的路径 NULL,/没有加载顺序组 NULL,/没有标记标识符 NULL,/没有依赖关系 NULL,/使用LocalSystem账户运行服务 NULL);/不需要指定密码 if(schService=NULL)printf(CreateService failed(%d)n,GetLastError();CloseServiceHandle(schSCManager);return;else printf(Service installed successfullyn);/关闭句柄 CloseServiceHandle(schService);CloseServiceHandle(schSCManager);,主函数_tmain(),int _tmain(int argc,_TCHAR*argv)/如果带有一个命令行参数-install,则安装服务if(argc=2 如果带有一个命令行参数-install,则调用SvcInstall()函数安装服务。下面的代码可以设计服务的具体功能,本例中省略了服务的具体功能。,9.2.3 打开服务,SC_HANDLE WINAPI OpenService(_in SC_HANDLE hSCManager,/调用OpenSCManager()函数返回的服务控制器句柄 _in LPCTSTR lpServiceName,/要打开的服务名 _in DWORD dwDesiredAccess/对服务的访问权限);,CloseServiceHandle()函数,对服务执行完操作之后,需要调用CloseServiceHandle()函数关闭打开的服务句柄,函数原型如下:BOOL WINAPI CloseServiceHandle(_in SC_HANDLE hSCObject/要关闭的服务句柄);,9.2.4 枚举服务列表,BOOL WINAPI EnumServicesStatusEx(_in SC_HANDLE hSCManager,_in SC_ENUM_TYPE InfoLevel,_in DWORD dwServiceType,_in DWORD dwServiceState,_out LPBYTE lpServices,_in DWORD cbBufSize,_out LPDWORD pcbBytesNeeded,_out LPDWORD lpServicesReturned,_in_out LPDWORD lpResumeHandle,_in LPCTSTR pszGroupName);,【例9.4】,编写程序,枚举并打印系统服务。代码见书。,9.2.5 启动服务,BOOL WINAPI StartService(_in SC_HANDLE hService,/要启动的服务的句柄 _in DWORD dwNumServiceArgs,/指定lpServiceArgVectors数组中的字符串的数量 _in LPCTSTR*lpServiceArgVectors/启动服务时的参数数组);如果函数执行成功,则函数返回TRUE;否则返回FALSE。,【例9.5】,编写程序,启动服务WebClient,代码如下:#include stdafx.h#include#include int _tmain(int argc,_TCHAR*argv)SC_HANDLE hSC;/服务管理器句柄SC_HANDLE handle;/服务句柄hSC=:OpenSCManager(NULL,/*SERVICES_ACTIVE_DATABASE*/NULL,SC_MANAGER_ALL_ACCESS);if(hSC=NULL)printf(无法连接服务管理器!);return 1;handle=:OpenService(hSC,WebClient,SERVICE_ALL_ACCESS);,接上,if(handle=NULL)printf(无法打开服务!);return 1;if(:StartService(handle,NULL,NULL)=FALSE)printf(无法启动服务!);return 2;return 0;,9.2.6 停止服务,调用ControlService()函数可以停止指定的服务,函数原型如下:BOOL WINAPI ControlService(_in SC_HANDLE hService,/要停止的服务的句柄 _in DWORD dwControl,/制定一个控制代码 _out LPSERVICE_STATUS lpServiceStatus/指向一个SERVICE_STATUS结构体,用于接收服务状态);,【例9.6】,编写程序,停止服务WebClient,代码如下:#include stdafx.h#include#include int _tmain(int argc,_TCHAR*argv)SC_HANDLE hSC;/服务管理器句柄SC_HANDLE handle;/服务句柄hSC=:OpenSCManager(NULL,/*SERVICES_ACTIVE_DATABASE*/NULL,SC_MANAGER_ALL_ACCESS);if(hSC=NULL)printf(无法连接服务管理器!);return 1;handle=:OpenService(hSC,WebClient,SERVICE_ALL_ACCESS);,接上,if(handle=NULL)printf(无法打开服务!);return 2;SERVICE_STATUS status;if(:ControlService(handle,SERVICE_CONTROL_STOP,9.2.7 查询服务的状态,调用QueryServiceStatusEx()函数可以查询指定服务的状态,函数原型如下:BOOL WINAPI QueryServiceStatus(_in SC_HANDLE hService,/服务的句柄 _out LPSERVICE_STATUS lpServiceStatus/使用SERVICE_STATUS结构体,用于接收服务的状态);,SERVICE_STATUS结构体,typedef struct _SERVICE_STATUS DWORD dwServiceType;DWORD dwCurrentState;DWORD dwControlsAccepted;DWORD dwWin32ExitCode;DWORD dwServiceSpecificExitCode;DWORD dwCheckPoint;DWORD dwWaitHint;SERVICE_STATUS,*LPSERVICE_STATUS;,【例9.7】,编写程序,查询服务WebClient的状态,代码如下:#include stdafx.h#include#include int _tmain(int argc,_TCHAR*argv)SC_HANDLE hSC;/服务管理器句柄SC_HANDLE handle;/服务句柄hSC=:OpenSCManager(NULL,/*SERVICES_ACTIVE_DATABASE*/NULL,SC_MANAGER_ALL_ACCESS);if(hSC=NULL)printf(无法连接服务管理器!n);return 1;handle=:OpenService(hSC,WebClient,SERVICE_ALL_ACCESS);,接上,if(handle=NULL)printf(无法打开服务!n);return 2;SERVICE_STATUS status;/获取服务的状态 if(:QueryServiceStatus(handle,接上,case SERVICE_PAUSED:printf(服务被暂停n);break;case SERVICE_RUNNING:printf(服务正在运行n);break;case SERVICE_START_PENDING:printf(服务正在启动n);break;case SERVICE_STOP_PENDING:printf(服务正在停止n);break;case SERVICE_STOPPED:printf(服务没有运行n);break;default:printf(未知状态n);break;system(pause);return 0;,9.2.8 修改服务的配置参数,调用ChangeServiceConfig()函数可以修改指定服务的配置参数,函数原型如下:BOOL WINAPI ChangeServiceConfig(_in SC_HANDLE hService,/服务句柄 _in DWORD dwServiceType,/服务类型 _in DWORD dwStartType,/服务启动类型 _in DWORD dwErrorControl,/指定错误的严重程度 _in LPCTSTR lpBinaryPathName,/服务的可执行文件的路径 _in LPCTSTR lpLoadOrderGroup,/服务所述的加载顺序组 _out LPDWORD lpdwTagId,/用于接收在参数lpLoadOrderGroup指定的组中的一个唯一标记 _in LPCTSTR lpDependencies,/包含服务名或加载顺序组名的数组,指定服务的依赖关系。数组中的服务和组必须在创建的服务之前被启动 _in LPCTSTR lpServiceStartName,/运行服务的账户名 _in LPCTSTR lpPassword,/参数lpServiceStartName指定的账户的密码 _in LPCTSTR lpDisplayName/服务的显示名);,【例9.8】,编写程序,将服务WebClient的启动状态设置为自动,代码如下:#include stdafx.h#include#include int _tmain(int argc,_TCHAR*argv)SC_HANDLE hSC;/服务管理器句柄SC_HANDLE handle;/服务句柄hSC=:OpenSCManager(NULL,/*SERVICES_ACTIVE_DATABASE*/NULL,SERVICE_CHANGE_CONFIG);if(hSC=NULL)printf(无法连接服务管理器!n);return 1;handle=:OpenService(hSC,WebClient,SERVICE_CHANGE_CONFIG);if(handle=NULL)printf(无法打开服务!n);return 2;,接上,:ChangeServiceConfig(handle,SERVICE_NO_CHANGE,SERVICE_AUTO_START,/修改服务为自动启动NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);:CloseServiceHandle(handle);return 0;,ChangeServiceConfig2()函数,调用ChangeServiceConfig2()函数可以修改指定服务的可选配置参数,函数原型如下:BOOL WINAPI ChangeServiceConfig2(_in SC_HANDLE hService,/服务句柄 _in DWORD dwInfoLevel,/要修改的服务配置信息 _in LPVOID lpInfo/要修改的服务配置信息的新值,如果为NULL,则不修改);,【例9.9】,编写程序,将服务WebClient的描述信息设置为“WebClient服务的描述信息”,代码如下:#include stdafx.h#include#include int _tmain(int argc,_TCHAR*argv)SC_HANDLE hSC;/服务管理器句柄SC_HANDLE handle;/服务句柄hSC=:OpenSCManager(NULL,/*SERVICES_ACTIVE_DATABASE*/NULL,SERVICE_CHANGE_CONFIG);if(hSC=NULL)printf(无法连接服务管理器!n);return 1;handle=:OpenService(hSC,WebClient,SERVICE_CHANGE_CONFIG);if(handle=NULL)printf(无法打开服务!n);return 2;,接上,SERVICE_DESCRIPTION Description;TCHAR szDescription1024;ZeroMemory(szDescription,1024);ZeroMemory(,结构体SERVICE_DESCRIPTION,typedef struct _SERVICE_DESCRIPTION LPTSTR lpDescription;/服务描述信息字符串 SERVICE_DESCRIPTION,*LPSERVICE_DESCRIPTION;,9.3 开发Windows服务程序,9.3.1 创建ATL服务应用程序9.3.2 安装和卸载ATL服务9.3.3 设置服务的属性,9.3.1 创建ATL服务应用程序,ATL(Active Template Library活动模板库)是微软开发的一组基于模板(template)的C+类。用于简化COM(Component Object Model,组件对象模型)编程。程序员可以使用Visual C+创建各种COM对象、OLE自动服务程序和ActiveX控件。ATL提供一个对象向导,使用它可以很快地建立对象的主要结构,从而使用户可以使用最少的手工编码来完成开发任务。由于篇幅所限,本书不对ATL技术的细节进行介绍,有兴趣的读者可以查阅相关资料学习。,创建ATL项目,在Visual Studio 2008中打开“新建项目”对话框,在“项目类型”列表中,选择“Visual C+”/“ATL”,然后在右侧的模板列表中选中“ALT项目”,如图9.7所示。,ATL项目向导,“应用程序配置”对话框,ATL服务解决方案中包含的项目,MyService:应用程序(.exe)类型的项目,用于生成ATL服务对应的可执行文件。MyServicePS:动态库(.dll)类型的项目,是服务程序与客户端进行通信的代理-存根(proxy-stub),用于负责服务程序与客户端的通信。,9.3.2 安装和卸载ATL服务,生成项目后,得到MyService.exe。但是如何使它以服务的形式运行呢?打开命令行窗口,契切换到MyService.exe所在的目录下,执行如下命令安装服务。MyService/Service,安全软件的提示,查看新安装的服务,卸载服务,打开命令行窗口,切换到MyService.exe所在的目录下,执行如下命令卸载服务。MyService/unRegServer,9.3.3 设置服务的属性,1设置服务名称2设置服务描述和启动方式,1设置服务名称,CAtlServiceModuleT:RegisterAppId()函数的原型如下:inline HRESULT RegisterAppId(bool bService=false/要注册为服务,必须使用true)throw();如果执行成功,则返回S_OK;否则返回一个错误值。,重载RegisterAppId()函数,HRESULT CMyServiceModule:RegisterAppId(bool bService=false)throw()HRESULT hr=S_OK;BOOL res=_super:RegisterAppId(bService);/调用父类的RegisterAppId()函数if(bService)if(IsInstalled()/如果服务安装成功/以修改配置的权限打开服务控制器SC_HANDLE hSCM=:OpenSCManager(NULL,NULL,SERVICE_CHANGE_CONFIG);SC_HANDLE hService=NULL;if(hSCM=NULL)hr=AtlHresultFromLastError();else/以修改配置的权限打开安装的服务hService=:OpenService(hSCM,m_szServiceName,SERVICE_CHANGE_CONFIG);if(hService!=NULL):ChangeServiceConfig(hService,SERVICE_NO_CHANGE,SERVICE_AUTO_START,/修改服务为自动启动NULL,NULL,NULL,NULL,NULL,NULL,NULL,m_szServiceName);/通过修改资源IDS_SERVICENAME 修改服务的显示名字,接上,/设置服务描述信息SERVICE_DESCRIPTION Description;TCHAR szDescription1024;ZeroMemory(szDescription,1024);ZeroMemory(,9.4 增加和使用组件,9.4.1 增加组件9.4.2 在客户端程序中使用组件类,9.4.1 增加组件,在菜单中选择“项目”/“添加类”,打开“添加类”窗口。在窗口左侧的“类别”列表中选择“ATL”,在右侧的“模板”列表中选择“ATL简单对象”,如图9.14所示。,“ATL简单对象向导”窗口,新添加的类CMyMath,MyMath.rgs,HKCRMyService.MyMath.1=s MyMath Classval AppID=s%APPID%,在组件类中添加函数,在类视图窗口中右击接口IMyMath,在弹出菜单中选择“添加”/“添加方法”,打开“添加方法向导”窗口。假定添加一个求和函数Sum,参照下面的方法添加参数。(1)参数属性选中in,参数类型选择 LONG,参数名输入 a,单击“添加”按钮;(2)参数属性选中in,参数类型选择 LONG,参数名输入 b,单击“添加”按钮;(3)参数类型选择 LONG*,参数属性选中retval,参数名输入 s,单击“添加”按钮;,修改sum()函数的代码,打开 MyMath.cpp 文件,找到 Sum 方法修改sum()函数的代码如下:STDMETHODIMP CMyMath:Sum(LONG a,LONG b,LONG*s)*s=a+b;return S_OK;,MyService.idl,MyService项目中还有一个自动生成的源文件MyService.idl,用于定义MyService服务的通用接口。在客户端程序中可以调用其中定义的通用接口。library MyServiceLibimportlib(stdole2.tlb);uuid(07090083-8787-4EFB-8472-4B3F7F570304),helpstring(MyMath Class)coclass MyMathdefault interface IMyMath;,9.4.2 在客户端程序中使用组件类,在生成ATL服务应用程序时,除了exe文件外,还可以生成一个tlb文件,其中包含COM的类型信息。在客户端程序中使用#import语句可以导入tlb文件,从而调用组件类,代码如下:#import MyService.tlb因为要引用MyServiceLib库中的类和接口,需要使用下面的钱语句定义默认的命名空间为MyServiceLib:using namespace MyServiceLib;,对客户端计算机进行配置,在客户端程序中使用ATL服务中的组件类时,有时会因为COM安全验证的原因被拒绝访问,可以按照下面的步骤对客户端计算机进行配置。在“运行”窗口中执行DCOMCNFG命令,打开“组件服务”窗口。在左侧的树结构中依次选择“控制台根目录”/“计算机”/“我的电脑”/“DCOM配置”,可以在右侧窗格种找到MyService组件,如图9.18所示。,组件属性窗口,1初始化COM环境,ATL服务中的类是COM组件类,因此在使用它之前,要调用CoInitialize()函数初始化COM环境,函数原型如下:HRESULT CoInitialize(LPVOID pvReserved/保留,必须为NULL);如果COM库初始化成功,则函数返回S_OK,如果返回S_FALSE,则表示COM库已经被初始化。,2获取COM组件类的CLSID,在调用COM组件类之前,需要调用CLSIDFromProgID()函数获取COM组件类的CLSID,函数原型如下:HRESULT CLSIDFromProgID(LPCOLESTR lpszProgID,/要获取CLSID的COM组件类的ProgID字符串 LPCLSID pclsid/用于接收返回的CLSID);如果成功获取指定COM组件类的CLSID,则函数返回S_OK;如果返回CO_E_CLASSSTRING,则表示指定的ProgID字符串对应的CLSID无效;如果返回REGDB_E_WRITEREGDB,则表示在将CLSID写入注册表中时发生错误。,3管理COM接口的智能指针,在客户端程序中可以通过COM接口来访问组件类,使用智能指针类CComPtr可以管理COM接口。类CComPtr的定义代码如下:templateclass CComPtr例如定义一个管理IMyMath接口的智能指针pMyMath,代码如下:CComPtr pMyMath;,4关闭COM库,在使用完COM库之后,需要调用CoUninitialize()函数关闭COM库,函数原型如下:void CoUninitialize(void);,【例9.10】,编写客户端程序,调用ATL服务MyService中类MyMath的Sum()函数,代码如下:#include stdafx.h#include/注意,将下面的路径更改为MyService.tlb文件所在的实际路径#import F:MyBookWindows系统编程源代码第章MyServiceMyServiceDebugMyService.tlbusing namespace MyServiceLib;int _tmain(int argc,_TCHAR*argv)/初始化COM环境CoInitialize(NULL);CLSID clsid;HRESULT hr=CLSIDFromProgID(OLESTR(MyService.MyMath),aa,9.5 Windows服务状态监视器实例,9.5.1 设计程序界面9.5.2 设计自定义类CService9.5.3 加载和监视服务,9.5.1 设计程序界面,创建一个基于对话框的项目ServiceManager,在主对话框IDD_SERVICEMANAGER_DIALOG中参照表9.15添加控件,并为其定义成员变量。,9.5.2 设计自定义类CService,class CServicepublic:CService(void);string Name;/服务名string Desc;/服务密描述 SERVICE_STATUS Status;/服务状态bool exist;/服务是否存在SC_HANDLE hSC;/服务管理器句柄SC_HANDLE handle;/服务句柄public:CService(void);void GetStatus();/获取服务状态void StartService();/启动服务void StopService();/停止服务;,GetStatus()函数,void CService:GetStatus()exist=true;/打开服务管理对象if(hSC=NULL)hSC=:OpenSCManager(NULL,/*SERVICES_ACTIVE_DATABASE*/NULL,SC_MANAGER_ALL_ACCESS);/打开服务handle=:OpenService(hSC,Name.c_str(),SERVICE_ALL_ACCESS);if(handle=NULL)exist=false;return;/获取服务的状态 if(:QueryServiceStatus(handle,StartService()函数,void CService:StartService()SERVICE_STATUS status;if(:StartService(handle,NULL,NULL)=FALSE)TRACE(无法启动服务!);return;,StopService()函数,void CService:StopService()SERVICE_STATUS status;if(:ControlService(handle,SERVICE_CONTROL_STOP,9.5.3 加载和监视服务,void CServiceManagerDlg:Init_Services()SC_HANDLE hSC;hSC=:OpenSCManager(NULL,/*SERVICES_ACTIVE_DATABASE*/NULL,SC_MANAGER_ALL_ACCESS);if(hSC=NULL)TRACE(无法打开服务管理对象!);exit(0);service_arr0.Name=WebClient;service_arr0.Desc=WebClient;service_arr0.hSC=hSC;service_arr1.Name=MyService;service_arr1.Desc=MyService;service_arr1.hSC=hSC;,

    注意事项

    本文(WIN系统服务编程.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开