Jak sprawdzić, czy program jest uruchomiony, pod swoją nazwą, z Qt (C++).Jak sprawdzić, czy program działa według jego nazwy z Qt (C++)?
Czy wykona się zadanie QProcess::pid
? Nie wiem, jak z niego korzystać. Proszę zasugeruj.
Jak sprawdzić, czy program jest uruchomiony, pod swoją nazwą, z Qt (C++).Jak sprawdzić, czy program działa według jego nazwy z Qt (C++)?
Czy wykona się zadanie QProcess::pid
? Nie wiem, jak z niego korzystać. Proszę zasugeruj.
O ile mi wiadomo, QProcess nie pozwoli ci na to (chyba że sam wykonasz proces), a właściwie nic w Qt. Jednak Win32 API zapewnia sposób, aby osiągnąć to, co chcesz przez EnumProcesses
funkcji i kompletny przykład jak używać przewidziano na stronie internetowej firmy Microsoft:
http://msdn.microsoft.com/en-us/library/ms682623.aspx
dostać trzeba zastąpić PrintProcessNameAndID z następujących funkcji:
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;
}
Chcesz się wypowiedzieć na temat sprawy? – jaho
+1, aby zrekompensować upadłość; nie wiem, dlaczego to zostało odrzucone. Podczas mojej odpowiedzi zamieściłem link do tej samej strony. Jest to z pewnością oficjalna metoda. –
szybki i brudny sposób to zrobić byłoby tylko sprawdzić wyjście tasklist
, coś jak:
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));
}
Korzystanie z EnumProcesses
jest prawdopodobnie lepszym sposobem (tj. bardziej "czysty"; z pewnością bardziej wydajne), ale może to być "wystarczająco dobre", o ile nie jest to wywołane dużą pętlą czy czymś. Ten sam pomysł mógłby również zostać przeniesiony na inne platformy, chociaż oczywiście narzędzie poleceń i logika analizy byłyby inne.
//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";
[Pytanie] (http://stackoverflow.com/questions/10422145/how-to-check-if-a-process-is-running-or-not) wydaje dopasuj się do twoich potrzeb tak długo, jak masz przedmiot. – chris
Tak, ale nie wiem jak używać QProcess :: state(), w ten sposób? QProcess :: state ("chrome.exe"); ?? – Random78952
Prawdopodobnie można uzyskać obiekt 'QProcess' za pomocą nazwy procesu za pomocą niektórych funkcji, a następnie wywołać go na tym. – chris