Как проверить, работает ли программа по имени С Qt (C++)

Как проверить, работает ли программа по имени С Qt (C++).

будет QProcess::pid выполнить задание? Я не знаю, как им пользоваться. Пожалуйста, предложите.

3 ответов


насколько я знаю, QProcess не позволит вам это сделать (если вы сами не породили процесс), и на самом деле ничего в Qt не будет. Однако Win32 API предоставляет способ достичь того, что вы хотите через EnumProcesses функция и полный пример того, как ее использовать, представлены на веб-сайте Microsoft:

http://msdn.microsoft.com/en-us/library/ms682623.aspx

чтобы получить вам нужно заменить PrintProcessNameAndID со следующей функцией:

bool matchProcessName( DWORD processID, std::string processName)
{
    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

    // Get a handle to the process.

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );

    // Get the process name.

    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
             &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName, 
                               sizeof(szProcessName)/sizeof(TCHAR) );
        }
    }

    // Compare process name with your string        
    bool matchFound = !_tcscmp(szProcessName, processName.c_str() );

    // Release the handle to the process.    
    CloseHandle( hProcess );

    return matchFound;
}

быстрый и грязный способ сделать это - просто проверить вывод tasklist, например:

bool isRunning(const QString &process) {
  QProcess tasklist;
  tasklist.start(
        "tasklist",
        QStringList() << "/NH" 
                      << "/FO" << "CSV" 
                      << "/FI" << QString("IMAGENAME eq %1").arg(process));
  tasklist.waitForFinished();
  QString output = tasklist.readAllStandardOutput();
  return output.startsWith(QString("\"%1").arg(process));
}

используя EnumProcesses, вероятно, лучший способ (т. е. более "чистый"; конечно, более эффективный), но это может быть "достаточно хорошо", пока это не вызывается в большом цикле или что-то в этом роде. Та же идея может быть перенесена и на другие платформы, хотя очевидно, что инструмент управления и логика синтаксического анализа будут другими.


 //How to Run App
 bool ok = QProcess::startDetached("C:\TTEC\CozxyLogger\CozxyLogger.exe");
 qDebug() <<  "Run = " << ok;


 //How to Kill App
 system("taskkill /im CozxyLogger.exe /f");
 qDebug() << "Close";

Введите описание изображения здесь