您的位置:首页 > 其它

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

2012-08-08 14:08 495 查看
最近在做一个跨平台项目,要取关于当前用户信息所有的进程信息。由于不太熟悉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;

}

以上就是我整理的两种方法,只是一部分有些地方要修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: