2012-05-17 4 views
0

Невозможно отобразить определенные параметры контекстного меню, если один из процессов не запущен ?. Я проверяю, запущен ли процесс или нет, с именем процесса.Как проверить, работает ли процесс или нет с помощью C++

Но проблема в том, что имя процесса отображается по-разному на разных платформах Windows.

т.е. окон 64 бит имя процесса на панели задач Windows является "applicationname.exe"

некоторые окна хр машина показывает то же имя процесса, как "~ 2.exe нанесени"

Пожалуйста, дайте мне знать последовательный способ проверить, работает ли этот процесс или нет?

Моя среда разработки C++ и Visual Studio 2010

DWORD getProcessID(const std::wstring& processName) 
    { 
     PROCESSENTRY32 info; 
     info.dwSize = sizeof(info); 

     HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 
     if (snapshot == INVALID_HANDLE_VALUE) 
      return 0; 

     Process32First(snapshot, &info); 
     if (!processName.compare(info.szExeFile)) 
     { 
      CloseHandle(snapshot); 
      return info.th32ProcessID; 
     } 

     while (Process32Next(snapshot, &info)) 
     { 
       if (!processName.compare(info.szExeFile)) 
       { 
        CloseHandle(snapshot); 
        return info.th32ProcessID; 
       } 
     } 

     CloseHandle(snapshot); 
    return 0; 
    } 
+0

Это конкретные окна, да? Вы должны добавить тег. – BoBTFish

+0

спасибо BobTFish, я запомню это в следующий раз. – JChan

+0

Вы пытались использовать 'Module32First'? См. Описание под 'szExeFile' [здесь] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684839 (v = vs.85) .aspx). – hmjd

ответ

1

EnumProcesses является другим способом перечислять активные процессы.

Разница заключается в том, что вам нужно выделить пространство для PIDs, вызовите EnumProcesses, откройте каждый процесс с PROCESS_QUERY_INFORMATION флагом доступа, а затем вызвать GetProcessImageFileName на его ручку и сделать сравнение.

+0

Хороший пример: http: //msdn.microsoft.com/en-us/library/windows/desktop/ms682623 (v = vs.85) .aspx –

0

Вы являетесь автором рассматриваемого процесса? Если это так, более надежным вариантом было бы использование IPC для непосредственного опроса процесса. Таким образом, вам необязательно проводить опрос, и у вас нет раздражающих проблем, например, что происходит, если вы обнаружите процесс, создаете контекстное меню, а затем процесс опускается?

+0

Добавление IPC редко делает процесс более надежным без существенных усилий, особенно если единственная цель - добиться того, чего уже позволяет ОС, например, мониторинг процесса. Каждый новый канал IPC - это эксплойт безопасности, ожидающий своего появления. –

0

Использование WMI для опроса экземпляров Win32_Process позволяет вам проверить полный путь выполнения процессов для соответствия тому, который вам нужно увидеть.

Смежные вопросы