Как проверить, работает ли программа по имени С 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";