Windows XP下Service的编程入门[2]

Windows XP下Service的编程入门[2]

// _dse.cpp : Defines the entry point for the console application.
// 作者: 秋镇菜
// E-mail: cyin8@msn.com

// 本程序很简单

#include "stdafx.h"
#include "windows.h"

int main(int argc, char* argv[])
{
    SC_HANDLE hSCManager = NULL;
    int nRet = 0;

    //
    // 打开服务控制管理器
    //
    hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if(hSCManager == NULL)
    {
        printf("OpenSCManager() failed. --err: %d/n", GetLastError());
        return -1;
    }

    //
    // 调用EnumServices列举系统中的服务
    //
    DWORD dwServicesReturned = 0;
    DWORD cbBytesNeeded = 0;
    DWORD cbBufSize = 0;

    //
    // 首次调用EnumServicesStatus确定缓冲区的大小,由cbBytesNeeded返回
    //
    nRet = EnumServicesStatus(
        hSCManager,
        SERVICE_DRIVER,
        SERVICE_STATE_ALL,
        NULL,
        0,
        &cbBytesNeeded,
        &dwServicesReturned,
        0);
/* ==============================================================================================
BOOL EnumServicesStatus(
 SC_HANDLE hSCManager,
 DWORD dwServiceType,
 DWORD dwServiceState,
 LPENUM_SERVICE_STATUS lpServices,
 DWORD cbBufSize,
 LPDWORD pcbBytesNeeded,
 LPDWORD lpServicesReturned,
 LPDWORD lpResumeHandle);

 EnumServicesStatus函数用于枚举NT下存在的Service。
 其中参数hSCManager是指向service control manager database的句柄,由OpenSCManager函数返回,且必须有SC_MANAGER_ENUMERATE_SERVICE的权限。
 参数dwServiceType指定按服务的类型枚举。
 参数dwServiceState指定按服务的状态枚举。
 参数lpServices指向ENUM_SERVICE_STATUS结构,用于存放返回的服务的名字和状态信息。
 参数cbBufSize返回参数lpServices的长度,以字节为单位。
 参数pcbBytesNeeded返回获取剩余的Service所需字节的个数。
 参数lpServicesReturned返回服务的个数。
 参数lpResumeHandle,当第一次调用时该参数为0,当该函数再次被调用以获取另外的信息时,该参数表示下一个被读的Service。
 函数返回值:函数执行成功则返回True,失败则返回False。
 值得注意的是通常情况下该函数返回的结果为FALSE,我们可以调用GetLastError()来获取进一步信息。因为一台机器上有多种服务存在,所以GetLastError()应为ERROR_MORE_DATA,此时应再次调用EnumServicesStatus函数以获取正确的Service列表。
============================================================================================== */
    ENUM_SERVICE_STATUS *lpServices = new ENUM_SERVICE_STATUS[cbBytesNeeded];

    cbBufSize = cbBytesNeeded;

    nRet = EnumServicesStatus(
        hSCManager,
        SERVICE_DRIVER,
        SERVICE_STATE_ALL,
        lpServices,
        cbBufSize,
        &cbBytesNeeded,
        &dwServicesReturned,
        0);
    if(nRet == 0)
    {
        printf("EnumServicesStatus() failed.");
        return NULL;
    }

    if(lpServices == 0)
    {
        CloseServiceHandle(hSCManager);
        return -1;
    }
 for(DWORD i = 0; i < dwServicesReturned; i++, lpServices++)
 {
            printf("%s/r/n->[%s]/n", lpServices->lpServiceName,
                lpServices->lpDisplayName);
 }
        printf("/r/nTotal %d Service(s)./n/n", dwServicesReturned);

 CloseServiceHandle(hSCManager);
        return 0;
}
// 请参考:
// Windows XP下Service的编程入门[1]->http://blog.youkuaiyun.com/i_like_cpp/archive/2005/06/03/387296.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值