各位大虾,我在VC2005下判断Wireless Zero Configuration服务是否存在,采用OpenService函数返回值判断,我的Wireless Zero Configuration服务存在,但是服务名中有空格,OpenService函数返回值错误,我试了其他存在Windows的服务,发现只要服务名中间有空格,函数返回值就错误,请教各位,很急,在线等。程序如下:SC_HANDLE schService;
   SC_HANDLE schSManager;
   schSManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
   schService = OpenServiceA(schSManager, (LPCSTR)(LPCTSTR)strServiceName, SERVICE_ALL_ACCESS);
  

解决方案 »

  1.   

    Wireless   Zero   Configuration 服务只是在你的服务管理器中用于显示的名称,真正用于API中的参数不一定相同。如你的系统上有这个服务吧:Application Layer Gateway Service。但你用这个名字肯定是打不开的,它对应的API参数名称是:ALG。只能用ALG来打开该服务。具体的参数名称你可以用以下代码打印出来:
    DWORD dwSt = SERVICE_WIN32,// | SERVICE_DRIVER, //这个参数和下面的一个参数请参考MSDN,根据你服务的不同设不同的值!
    dwSs = SERVICE_ACTIVE,
    dwNeed = 0,
    dwRet = 0,
    dwResume = 0;
          
    dwSize = 0x3000; // 如果下面EnumServicesStatus失败,请指定一个更大的内存值!
    char *pMem = new char[dwSize];
    EnumServicesStatus(hServices, dwSt, dwSs, (ENUM_SERVICE_STATUS*)pMem, dwSize, &dwNeed, &dwRet, &dwResume); char *p = pMem;
    dwNeed = sizeof(ENUM_SERVICE_STATUS);
    TRACE(_T("\n\n"));
    for(dwSize = 0; dwSize < dwRet; ++dwSize)
    {
    // 前一个是API中参数传入的名称,后一个就是你所说的“服务名”,它只是显示用的:
    TRACE(_T("%20s;\t%s\n"), ((ENUM_SERVICE_STATUS*)p)->lpServiceName, ((ENUM_SERVICE_STATUS*)p)->lpDisplayName);
    p += dwNeed;
    }
    TRACE(_T("\n\n"));
    delete[] pMem;
      

  2.   

    权限不够 把进程弄成调式权限
    HANDLE hToken;
    HANDLE hProcess;   // Try to adjust privileges  
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, 
          &hToken)) { 
           TOKEN_PRIVILEGES tp;
           tp.PrivilegeCount = 1;
           LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
           tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
           AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
           CloseHandle(hToken);
    }
    在前面加上这个看看
      

  3.   

    补充一下,如果不想麻烦,以下函数可以得到对应于显示名称的键(API参数)名称:GetServiceKeyName。参数请查MSDN。