3.4.2 界面实现 添加一个窗体,并按照下表设置窗体的属性 http://www.paper51.com 表3.4 显示工作站信息窗体设置表 paper51.com
窗体属性 copyright paper51.com
取值 内容来自论文无忧网 www.paper51.com Name paper51.com
detail 内容来自www.paper51.com Caption http://www.paper51.com 网络工作站及当前用户信息 http://www.paper51.com 该窗体首先添加一个ListBox控件,然后在控件上添加8个label控件,其中6个对应返回的工作站信息分别设置其Caption属性,另一个Label控件设置标题为“函数调用成功(0)或错误次数:“,剩余一个Label控件标题为调用NetWkstaGetInfo()函数出错的次数,无错则返回0,1个commandbotton控件。添加完毕后的窗体如图所示: http://www.paper51.com
http://www.paper51.com
图3.4 显示工作站信息 内容来自www.paper51.com 用户单击按钮,获取WKSTA_INFO_102结构中的工作站信息,调用函数GetWorkstationUserName()返回指定机器的当前注册用户名,列表框中将显示出工作站的配置信息、用户数目以及登陆用户名。 copyright paper51.com 3.5 列举本机服务 内容来自论文无忧网 www.paper51.com 3.5.1 功能设计 copyright paper51.com 这个窗体主要用来列举本机在指定的服务控制管理器(SCM:Service Control Manager)数据库中的服务,返回每个服务的名称和状态信息。使用API函数EnumServicesStatus枚举指定的SCM数据库中的服务,包括服务的名称和状态(为了成功调用函数EnumServicesStatus,必须先调用函数OpenSCManager打开服务管理数据库。一旦获得了数据库的句柄,就可以调用该函数了),获取的相关信息记录在ENUM_SERVICE_STATUS结构中,并由SERVICE_STATUS结构返回服务的有关信息。程序执行时,首先调用EnumServicesStatus函数获取服务信息,然后判断是否枚举成功,并枚举了所有服务信息,若完成,则调用相关函数将信息返回显示在列表框中。其中主要的函数及结构定义如下: 内容来自论文无忧网 www.paper51.com (1)函数OpenSCManager 内容来自论文无忧网 www.paper51.com
SC_HANDLE OpenSCManager( 内容来自论文无忧网 www.paper51.com
LPCTSTR lpMachineName, ‘机器名地址 paper51.com LPCTSTR lpDatabaseName, ‘数据库名地址 paper51.com
DWORD dwDesireAccess, ‘访问类型,本程序使用SC_MANAGER_ENUMERATE_SERVICE类型,允许调用EnumServicesStatus函数来列举数据库中的服务 内容来自www.paper51.com ); 内容来自论文无忧网 www.paper51.com
(2)函数EnumServicesStatus 内容来自www.paper51.com BOOL EnumServiceStatus( http://www.paper51.com SC_HANDLE hSCManager, http://www.paper51.com DWORD dwServiceType, 内容来自www.paper51.com DWORD dwServiceState, paper51.com LPENUM_SERVICE_STATUS lpServices, 内容来自论文无忧网 www.paper51.com
…… 内容来自www.paper51.com
LPDWORD lpServicesReturned, http://www.paper51.com LPDWORD lpResumeHandle paper51.com
); http://www.paper51.com
hSCManager:SCM数据库的句柄。由函数OpenSCManager返回。 copyright paper51.com dwServiceType:枚举的服务类型,本程序使用SERVICE_WIN32类型,枚举SERVICE_WIN32_OWN_PROCESS和SERVICE_WIN32_SHARE_PROCESS类型的服务 内容来自www.paper51.com dwServiceState: 程序使用SERVICE_STATE_ALL类型,枚举处于SERVICE_ACTIVE和SERVICE_INACTIVE运行状态的服务 内容来自论文无忧网 www.paper51.com lpServices:一个ENUM_SERVICE_STATUS结构的数组指针,其中包含了返回的数据库中的每个服务的名称和服务状态的信息 内容来自www.paper51.com pcbBytesNeeded:指向一个DWORD变量的指针,该变量给出了接收剩余的服务入口所需的缓冲的字节数量 内容来自www.paper51.com
lpResumeHandle:指向一个DWORD变量的指针,该变量是一个输入/输出参数,用于输入时,它指定了枚举开始的入口地址,用于输出时,如果函数调用成功,则该参数的值为0。 paper51.com 如果函数调用成功,则返回非零值;否则返回0。可调用函数GetLastError来获取详细的错误信息。 copyright paper51.com
(3)ENUM_SERVICE_STATUS结构 内容来自www.paper51.com Typedef struct_ENUM_SERVICE_STATUS( paper51.com
LPTSTR lpServiceName; ‘指明了SCM数据库中的服务的名称 内容来自www.paper51.com …… copyright paper51.com SERVICE_STATUS ServiceStatus; ‘指定一个SERVICE_STATUS结构,结构中包含了返回的lpServiceName指定的服务状态信息 paper51.com )ENUM_SERVICE_STATUS,*LPENUM_SERVICE_STATUS; copyright paper51.com (4)SERVICE_STATUS结构 内容来自论文无忧网 www.paper51.com Typedef struct_SERVICE_STATUS( paper51.com DWORD dwServiceType; ‘标明返回的服务类型 http://www.paper51.com DWORD dwCurrentState; ‘指明服务的当前状态 内容来自www.paper51.com …… 内容来自论文无忧网 www.paper51.com )SERVICE_STATUS, *LPSERVICE_STATUS; 内容来自www.paper51.com
窗体中使用函数EnumSystemServices()枚举系统中的用户: 内容来自www.paper51.com
Private functionEnumSystemServices(ct1 as control)as long 内容来自论文无忧网 www.paper51.com …… copyright paper51.com
If EnumServicesStatus(hSCManager,SERVICE_WIN32, SERVICE_STATE_ALL, pntr(0), cbBuffSize, cbRequired, dwReturned,hEnumResume) Then 内容来自www.paper51.com ‘从pntr()数组中提取所需的信息 paper51.com
With List1 copyright paper51.com Clear paper51.com
Fori = 0 To dwReturned - 1 内容来自www.paper51.com sDispName = GetStrFromPtrA(ByVal pntr(i).lpDisplayName) 内容来自www.paper51.com sSvcName = GetStrFromPtrA(ByVal pntr(i).lpServiceName) copyright paper51.com
dwState = pntr(i).ServiceStatus.dwCurrentState 内容来自www.paper51.com .AddItemsDispName & vbTab & sSvcName & vbTab & GetServiceState(dwState) copyright paper51.com Next http://www.paper51.com End With 内容来自论文无忧网 www.paper51.com …… copyright paper51.com
EnumSystemServices = dwReturned ‘返回服务的数量 内容来自www.paper51.com End Function 内容来自论文无忧网 www.paper51.com 以下是获取服务状态的函数: copyright paper51.com
Private FunctionGetServiceState(dwState As Long) As String http://www.paper51.com Select Case dwState 内容来自www.paper51.com CaseSERVICE_STOPPED: GetServiceState = "停止" copyright paper51.com CaseSERVICE_START_PENDING: GetServiceState = "启动期间" 内容来自论文无忧网 www.paper51.com …… http://www.paper51.com CaseSERVICE_PAUSED: GetServiceState = "暂停" paper51.com
Case Else:GetServiceState = "" copyright paper51.com EndSelect http://www.paper51.com End Function http://www.paper51.com |