两种方法实现枚举windows下运行进程

来源:互联网 发布:怎么投诉淘宝店家 编辑:程序博客网 时间:2024/05/21 14:03

最近在做一个跨平台项目,要取关于当前用户信息所有的进程信息。由于不太熟悉windows下的api 所以也摸索了一下。在这里就整理下实现方法第一种方法:

typedef PIDList    vector<long> ;

bool ProcessInfo::EnumCurrentUserProcess(PIDList& pids)
{
TCHAR iPUserName[MAX_PATH] = {0};
SID_NAME_USE snu;
TCHAR buffUsername[MAX_PATH] = {0};
TCHAR buffDomainname[MAX_PATH] = {0};
DWORD unSize;
DWORD dnSize;
std::string userName;
WTS_PROCESS_INFO* ppi;
WTS_PROCESS_INFO* tp;
DWORD ppin;
//返回特定服务上的活动进程
if (!getUserName(userName))
{
return false;
}
if(::WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &ppi, &ppin))   
{
tp = ppi;
for(DWORD i = 0; i < ppin; i++)
{
unSize = sizeof(buffUsername);
dnSize = sizeof(buffDomainname);
if(LookupAccountSid(NULL, tp->pUserSid, buffUsername, &unSize, buffDomainname, &dnSize, &snu))
{
lstrcpy(iPUserName, buffUsername);
}
if (userName.compare(iPUserName))
{
pids.push_back(tp->ProcessId);
}
tp++;
}
//status.insert(pair(userName,))
::WTSFreeMemory(ppi);
}
}

//由于在windows好像貌似没有uid的概念,所以,我就暂时用用户名字去比对
bool ProcessInfo::getUserName(std::string& strUserName)//获取当前用户名
{
char cbUser[80] = {0};
DWORD cSize = 80; 
if (GetUserName(cbUser,&cSize))
{
strUserName = cbUser;
return true;
}
return false;
}

第二种方法枚举所有进程,但是这个方法获取的结构体里没有所属用户的属性,所以不太方便。但是,这个结构体获取的进程信息很详细。windows为什么就不能像linux一样呢。什么都放到一个文件里,这样都方便许多

int main(int argc,char* argv[ ])
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
if (hProcessSnap == INVALID_HANDLE_VALUE) 
{
//cout<<"CreateToolhelp32Snapshot 调用失败"<<endl;
return false;
}
BOOL bMore = ::Process32First(hProcessSnap,&pe32); 
while(bMore)
{
std::wcout<<"进程ID:"<<pe32.th32ProcessID<<" 进程名称:"<<pe32.szExeFile<<std::endl;
bMore = ::Process32Next(hProcessSnap,&pe32);
}
::CloseHandle(hProcessSnap);
return true;
}



以上就是我整理的两种方法,只是一部分有些地方要修改。

原创粉丝点击