10

プログラムがQt(C ++)で実行されているかどうかをその名前で確認する方法。

QProcess::pid仕事をしますか?使い方がわかりません。提案してください。

4

3 に答える 3

19

私の知る限り、QProcessではそれを実行できません(自分でプロセスを生成した場合を除きます)。実際、Qtでは何も実行できません。ただし、Win32 APIは、EnumProcesses関数を介して目的を達成する方法を提供し、その使用方法の完全な例は、MicrosoftのWebサイトで提供されています。

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;
}
于 2012-11-29T21:32:57.910 に答える
11

それを行うための迅速で汚い方法は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する方がおそらくより良い方法です(つまり、より「純粋」で、確かによりパフォーマンスが高くなります)が、これが大きなループなどで呼び出されない限り、これは「十分に良い」可能性があります。同じアイデアを他のプラットフォームにも移植できますが、コマンドツールと解析ロジックは明らかに異なります。

于 2012-11-29T21:49:44.853 に答える
-3
 //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";

ここに画像の説明を入力してください

于 2018-01-06T07:39:05.693 に答える