2012-11-29 4 views
9

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.

+2

[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

+0

Tak, ale nie wiem jak używać QProcess :: state(), w ten sposób? QProcess :: state ("chrome.exe"); ?? – Random78952

+1

Prawdopodobnie można uzyskać obiekt 'QProcess' za pomocą nazwy procesu za pomocą niektórych funkcji, a następnie wywołać go na tym. – chris

Odpowiedz

16

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; 
} 
+0

Chcesz się wypowiedzieć na temat sprawy? – jaho

+1

+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. –

8

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.

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

enter image description here

Powiązane problemy