Как я узнаю, работает ли .exe на c ++? - PullRequest
3 голосов
/ 28 июля 2010

Как узнать, выполняется ли исполняемый файл в Windows по имени процесса, например, program.exe?

Ответы [ 4 ]

5 голосов
/ 28 июля 2010

Стандартная библиотека C ++ не имеет такой поддержки. Вам нужен API операционной системы для этого. Если это Windows, то вы должны использовать CreateToolhelp32Snapshot (), а затем Process32First и Process32Next для итерации запущенных процессов. Остерегайтесь неизбежного состояния гонки, процесс мог завершиться к тому времени, когда вы его нашли.

2 голосов
/ 28 декабря 2010

Я только что создал один, используя предложение Ганса. Работает как чемпион!

Да, и вот основной код.

Пожалуйста, вам нужно будет добавить CStrings sAppPath и sAppName.

StartProcess - небольшая функция, которая использует CreateProcess и возвращает PID (здесь не используется). Вам нужно будет заменить его.

Это не полная программа, а просто код, чтобы определить, работает ли программа по совету Ганса. Забавный тест - установить путь к c: \ windows \ и приложению notepad.exe и установить его на 10 секунд.

#include <tlhelp32.h>
PROCESSENTRY32 pe32 = {0}; 
HANDLE    hSnap;
int       iDone;
int       iTime = 60;
bool      bProcessFound;

while(true)    // go forever
{
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    pe32.dwSize = sizeof(PROCESSENTRY32); 
    Process32First(hSnap,&pe32);     // Can throw away, never an actual app

    bProcessFound = false;   //init values
    iDone = 1;

    while(iDone)    // go until out of Processes
    {
        iDone = Process32Next(hSnap,&pe32);
        if (strcmp(pe32.szExeFile,sAppName) == 0)    // Did we find our process?
        {
            bProcessFound = true;
            iDone = 0;
        }
    }

    if(!bProcessFound)    // if we didn't find it running...
    {
        startProcess(sAppPath+sAppName,"");             // start it
    }
    Sleep(iTime*1000);    // delay x amount of seconds.
}
0 голосов
/ 28 июля 2010
hProcessInfo = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );

            do{
                if(strcmp(pe32.szExeFile,"process.exe") == 0)
                {
                    processfound = true;
                    break;
                }
}while( Process32Next( hProcessSnap, &pe32 ) );

Если вы не хотите получать подробности процесса из кода, просто нажмите Ctrl + Alt + Del и проверьте список процессов.

0 голосов
/ 28 июля 2010

Допущения: поскольку вы упоминаете «.exe», вы хотите это для некоторой разновидности Windows.Вы хотите написать программу на C ++, чтобы определить, выполняется ли программа с конкретным именем исполняемого файла (независимо от языка, используемого для реализации целевой программы).

Перечисление запущенных процессов с использованием либо API-интерфейса Toolhelp, либоAPI статуса процесса.Сравните имя исполняемого файла для каждого запущенного процесса с тем, который вы ищете (и учтите, что может быть несколько процессов с таким исполняемым именем).

...