プログラムがQt(C ++)で実行されているかどうかをその名前で確認する方法。
QProcess::pid
仕事をしますか?使い方がわかりません。提案してください。
プログラムがQt(C ++)で実行されているかどうかをその名前で確認する方法。
QProcess::pid
仕事をしますか?使い方がわかりません。提案してください。
私の知る限り、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;
}
それを行うための迅速で汚い方法は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
する方がおそらくより良い方法です(つまり、より「純粋」で、確かによりパフォーマンスが高くなります)が、これが大きなループなどで呼び出されない限り、これは「十分に良い」可能性があります。同じアイデアを他のプラットフォームにも移植できますが、コマンドツールと解析ロジックは明らかに異なります。
//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";