能力值:
( LV8,RANK:130 )
|
-
-
2 楼
第一次调用EnumServicesStatus是确定服务是数量,百分之百的会出错这个错误是故意的,第二次使用EnumServicesStatus的叁数才是返回PENUM_SERVICE_STATUS数组。
|
能力值:
( LV11,RANK:190 )
|
-
-
3 楼
若有所悟,你的意思是只会返回所需空间的大小是吧。那个size申请会浪费很大的空间。我修正代码了。谢谢了
DWORD ServicesCount = 0;
DWORD size = 0;
SC_HANDLE hHandle = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(hHandle == NULL)
return 1;
if(!EnumServicesStatus(hHandle,SERVICE_WIN32,SERVICE_STATE_ALL,NULL,0,&size,&ServicesCount,NULL))
{
printf("%d\n",size);
printf("%d\n",ServicesCount);
if(GetLastError() == ERROR_MORE_DATA)
{
LPENUM_SERVICE_STATUS lpinfo;
//lpinfo = new ENUM_SERVICE_STATUS[245];
lpinfo = (LPENUM_SERVICE_STATUS)VirtualAlloc(NULL,size,MEM_COMMIT,PAGE_READWRITE);
if(EnumServicesStatus(hHandle,SERVICE_WIN32,SERVICE_STATE_ALL,(LPENUM_SERVICE_STATUS)lpinfo,size,&size,&ServicesCount,NULL))
{
/*printf("0x%x\n",lpinfo);
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(lpinfo,&mbi,sizeof(mbi));
printf("%d\n",mbi.RegionSize);*/
for(int i=0;i<(int)ServicesCount;i++)
{
printf("%-50s\n",(LPENUM_SERVICE_STATUS)lpinfo[i].lpDisplayName);
//printf("%d\n",i);
}
getchar();
}
// delete lpinfo;
VirtualFree(lpinfo,size,MEM_RELEASE);
}
}
|