2016-07-12 15 views
-1

Qtを使用して、実行中のプロセスを1つずつスキャンする必要があります。だから私はQ302Listのすべての実行中のプロセスのフルパスを保存したい。QT:実行中のすべてのプロセスをQStringListに保存する方法

私はこのコードを試みたが、エラーcrt0_c.cました:-1:エラー:-1:: `のWinMain @ 16'collect2.exeに未定義の参照のエラー:エラー:ldは1つの終了ステータス

を返さ
unsigned long aProcesses[1024], cbNeeded, cProcesses; 

if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) { 
} 

QStringList lprocess; 

cProcesses = cbNeeded/sizeof(unsigned long); 

for (unsigned int i = 0; i < cProcesses; i++) 

    { 

    if (aProcesses[i] == 0) 

     continue; 

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, aProcesses[i]); 

    wchar_t buffer[50]; 

    GetModuleBaseName(hProcess, 0, buffer, 50); 

    CloseHandle(hProcess); 

    lprocess << QString::fromWCharArray(buffer); 
} 

ui->listWidget->addItems(lprocess); 
+2

[定義されていない参照/未解決の外部シンボルエラーとは何ですか?どうすれば修正できますか?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-外部記号エラーと方法i-fix) – drescherjm

+0

@drescherjmわからないのですか?問題を解決するために私に詳細な答えを教えてもらえますか? –

答えて

1

あなたの機能におそらく名前mainが使用されています。

他にも多くの機能がありません。 GetModuleFileNameExのライブラリも追加する必要があります。

#include <QCoreApplication> 
#include <QString> 
#include <QStringList> 
#include <iostream> 
#include <windows.h> 
#include <TlHelp32.h> 
#include <psapi.h> 

QStringList foo() 
{ 
    QStringList list; 
    HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPMODULE, 0); 
    if (hndl) 
    { 
     PROCESSENTRY32 process; 
     memset(&process, 0, sizeof(PROCESSENTRY32)); 
     process.dwSize = sizeof(PROCESSENTRY32); 
     Process32First(hndl, &process); 
     do 
     { 
      QString qpath; 
      wchar_t path[MAX_PATH] = L""; 
      HANDLE hProcess = OpenProcess(
          PROCESS_QUERY_INFORMATION, FALSE, process.th32ProcessID); 
      if (hProcess) 
      { 
       GetModuleFileNameEx(hProcess, NULL, path, MAX_PATH); 
       qpath = QString::fromUtf16((const ushort*)path); 
       CloseHandle(hProcess); 
      } 
      else 
      { 
       qpath = QString::fromUtf16((const ushort*)process.szExeFile); 
      } 

      list.append(qpath); 
     } while (Process32Next(hndl, &process)); 

     CloseHandle(hndl); 
    } 
    return list; 
} 

用法:

QStringList list = foo(); 
for(int i = 0; i < list.count(); i++) 
{ 
    //print list[i]... 
    //or 
    std::wcout << (const wchar_t*)list[i].utf16() << std::endl; 
} 


がいっぱい取得するために管理者モードでプログラムを実行しているMinGWの

win32: LIBS += -lpsapi 

例を使用した場合は、Windowsのライブラリ "psapi.lib" を必要とするか、 "libpsapi.a"経路:

#include <iostream> 
#include <windows.h> 
#include <winbase.h> 
#include <TlHelp32.h> 
#include <psapi.h> 
#include <Shlobj.h> 

void test() 
{ 
    if (!IsUserAnAdmin()) 
     std::wcout << "Run this in admin mode!\n"; 

    void* tokenHandle; 
    TOKEN_PRIVILEGES privilegeToken; 
    LookupPrivilegeValue(0, SE_DEBUG_NAME, &privilegeToken.Privileges[0].Luid); 
    privilegeToken.PrivilegeCount = 1; 
    privilegeToken.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &tokenHandle); 
    AdjustTokenPrivileges(tokenHandle, 0, &privilegeToken, sizeof(TOKEN_PRIVILEGES), 0, 0); 
    CloseHandle(tokenHandle); 

    HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPMODULE, 0); 
    if (hndl) 
    { 
     PROCESSENTRY32 process; 
     memset(&process, 0, sizeof(PROCESSENTRY32)); 
     process.dwSize = sizeof(PROCESSENTRY32); 
     Process32First(hndl, &process); 
     do 
     { 
      wchar_t path[MAX_PATH] = L""; 
      wcscpy_s(path, MAX_PATH, process.szExeFile); 

      HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, process.th32ProcessID); 
      if (hProcess) 
      { 
       GetModuleFileNameExW(hProcess, 0, path, MAX_PATH); 
       CloseHandle(hProcess); 
      } 
      else 
      { 
       //in case it failed in WinXP 
       hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process.th32ProcessID); 
       if (hProcess) 
       { 
        GetModuleFileNameExW(hProcess, 0, path, MAX_PATH); 
        CloseHandle(hProcess); 
       } 
      } 

      std::wcout << path << std::endl; 

     } while (Process32Next(hndl, &process)); 

     CloseHandle(hndl); 
    } 
} 
+0

多くのプロセスのプロセス名のみが表示されます。例:svchost.exeが表示されました。私はC:\ Windows \ System32 \ svchost.exeが必要です –

+0

これらはシステム・プログラムまたはウイルス対策のような重要なファイルですので、OpenProcessが失敗してフルネームを取得できません。それを開くことができない場合は、おそらくc:\ windows \ system32にあります。これを回避する唯一の方法は、 'AdjustTokenPrivileges' /' SE_PRIVILEGE_ENABLED'でトークン権限を調整し、管理モードでプログラムを実行することです。また、フラグを 'PROCESS_QUERY_LIMITED INFORMATION'に変更し、' PROCESS_VM_READ'を削除すると、アクセスが容易になります。 –

+0

どのようにすればいいですか?あなたの答えを編集してください。 –

関連する問題