2012-11-29 6 views
9

Wie zu überprüfen, ob ein Programm mit seinem Namen mit Qt (C++) ausgeführt wird.Wie überprüft man, ob ein Programm mit seinem Namen mit Qt (C++) läuft

Wird QProcess::pid den Job erledigen? Ich weiß nicht, wie ich es benutzen soll. Bitte vorschlagen.

+2

[Diese Frage] (http://stackoverflow.com/questions/10422145/how-to-check-if-a-process-is-running-or-not) scheint passen Sie Ihre Bedürfnisse an, solange Sie das Objekt haben. – chris

+0

Ja, aber ich weiß nicht, wie QProcess :: state() verwendet wird, so? QProcess :: state ("chrome.exe"); ?? – Random78952

+1

Vermutlich können Sie ein 'QProcess'-Objekt durch den Prozessnamen mit einer Funktion erhalten und dann darauf zugreifen. – chris

Antwort

16

Soweit ich weiß, erlaubt QProcess Ihnen das nicht (es sei denn, Sie haben den Prozess selbst erzeugt) und tatsächlich nichts in Qt. Allerdings bietet Win32-API, einen Weg zu erreichen, was Sie durch EnumProcesses Funktion wollen und ein komplettes Beispiel dafür, wie es zu benutzen ist auf Microsoft-Website zur Verfügung gestellt:

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

Um Sie PrintProcessNameAndID mit der folgenden Funktion ersetzen müssen:

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

Care, um den Downvote zu kommentieren? – jaho

+1

+1 zum Ausgleich für den Downvote; nicht sicher, warum dies abgelehnt wurde. Ich wollte in meiner Antwort einen Link zu derselben Seite einfügen. Dies ist sicherlich der offizielle Weg, dies zu tun. –

8

Eine schnelle und schmutzige Art und Weise es zu tun wäre die Ausgabe von tasklist, etwas zu einfach überprüfen wie:

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)); 
} 

Verwenden EnumProcesses ist wahrscheinlich ein besserer Weg (d. H. mehr "rein"; sicherlich leistungsfähiger), aber das kann "gut genug" sein, solange es nicht in einer großen Schleife oder so aufgerufen wird. Die gleiche Idee könnte auch auf andere Plattformen portiert werden, obwohl das Befehlswerkzeug und die Parsing-Logik offensichtlich anders wären.

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