各位大虾,我在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);
SC_HANDLE schSManager;
schSManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
schService = OpenServiceA(schSManager, (LPCSTR)(LPCTSTR)strServiceName, SERVICE_ALL_ACCESS);
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;
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);
}
在前面加上这个看看