【问题标题】:Getting process ID's获取进程 ID
【发布时间】:2014-03-18 09:38:25
【问题描述】:

我下面的程序会将进程的名称连接到names 字符串中。如何更改它以包含进程 ID 而不是名称? names 应该是什么类型,如何初始化它以及如何连接其中的每个proc32.th32ProcessID

PROCESSENTRY32 proc32;    
TCHAR names[MAX_PATH]=L""; 

if(hSnap == INVALID_HANDLE_VALUE)
{
    cout<<"invalid handle value error!\n";
    return;
}


proc32.dwSize = sizeof(PROCESSENTRY32);


if(!Process32First(hSnap, &proc32))
{
    cout<<"Tread32First() error!\n";
    CloseHandle(hSnap);
    return ;
}

do
{

        //cout<<"Current process id: "<<GetCurrentProcessId()<<"\n";
        wcout<<L"Process Name: "<<proc32.szExeFile<<"\n";
        cout<<"Process ID: "  <<proc32.th32ProcessID<<"\n";
        cout<<"Thread Count: "<<proc32.cntThreads<<"\n"<<endl;

            lstrcat(names, proc32.szExeFile);
            lstrcat(names, L"\n");



}while(Process32Next(hSnap, &proc32));

【问题讨论】:

  • 这不是 C,而是 C++。所以请使用std::stringstd::wstring
  • 更具体地说明 David 的意思:使用 std::basic_string&lt;TCHAR&gt; 代替 names,这样您就可以轻松连接字符串,而不必担心数组大小。
  • 认真的吗?你读过代码吗,尤其是它两次打印出进程id,并将进程id与当前进程id进行比较的部分?
  • 我这样做是为了排除当前的 id。每次都会打印它,实际上但已经从我的原始程序中排除了该部分。介意给我看一个@MicroVirus 的例子吗?我有点困惑。

标签: c++ winapi process tchar dword


【解决方案1】:

既然您无论如何都在使用 C++,那么您应该使用它。使用std::vectorstd::wstring等:

PROCESSENTRY32W proc32;    
vector<wstring> names; 
vector<DWORD> ids;

if (hSnap == INVALID_HANDLE_VALUE)
{
    cout << "invalid handle value error!" << endl;
    return;
}

proc32.dwSize = sizeof(PROCESSENTRY32W);

if (!Process32FirstW(hSnap, &proc32))
{
    cout << "Tread32First() error!" << endl;
    CloseHandle(hSnap);
    return ;
}

do
{
    //cout << "Current process id: " << GetCurrentProcessId() << endl;
    wcout << L"Process Name: " << proc32.szExeFile << endl;
    cout << "Process ID: " << proc32.th32ProcessID << endl;
    cout << "Thread Count: " << proc32.cntThreads << endl << endl;

    names.push_back(proc32.szExeFile);
    ids.push_back(proc32.th32ProcessID);
}
while (Process32Next(hSnap, &proc32));

// use names and ids as needed...

或者:

PROCESSENTRY32W proc32;    
vector<PROCESSENTRY32W> procs; 

if (hSnap == INVALID_HANDLE_VALUE)
{
    cout << "invalid handle value error!" << endl;
    return;
}

proc32.dwSize = sizeof(PROCESSENTRY32W);

if (!Process32FirstW(hSnap, &proc32))
{
    cout << "Tread32First() error!" << endl;
    CloseHandle(hSnap);
    return ;
}

do
{
    //cout << "Current process id: " << GetCurrentProcessId() << endl;
    wcout << L"Process Name: " << proc32.szExeFile << endl;
    cout << "Process ID: " << proc32.th32ProcessID << endl;
    cout << "Thread Count: " << proc32.cntThreads << endl << endl;

    procs.push_back(proc32);
}
while (Process32Next(hSnap, &proc32));

// use procs as needed...    

【讨论】:

    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 2011-07-16
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多