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

Как проверить, запущена ли программа по имени с помощью Qt (C ++).

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

9

Решение

Насколько я знаю, 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;
}
17

Другие решения

Быстрый и грязный способ сделать это будет просто проверить вывод 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 это, вероятно, лучший способ (то есть более «чистый»; безусловно, более производительный), но это может быть «достаточно хорошо», если это не вызывается в большом цикле или как-то еще. Эту же идею можно перенести и на другие платформы, хотя очевидно, что командный инструмент и логика синтаксического анализа будут другими.

10

 //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";

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

0
По вопросам рекламы [email protected]