首頁>Club>
5
回覆列表
  • 1 # 使用者8610821428814

    Win32程序間通訊的方式主要有:

    (1)剪貼簿(Clip Board);

    (2)動態資料交換(Dynamic Data Exchange);

    (3)部件物件模型(Component Object Model);

    (4)檔案對映(File Mapping);

    (5)郵件槽(Mail Slots);

    (6)管道(Pipes);

    (7)Win32套接字(Socket);

    (8)遠端過程呼叫(Remote Procedure Call);

    (9)WM_COPYDATA訊息(WM_COPYDATA Message)。 在WIN32中,可使用在PSAPI .DLL中提供的Process status Helper函式幫助我們獲取程序資訊。

    (1)EnumProcesses()函式可以獲取程序的ID,其原型為:

    BOOL EnumProcesses(DWORD * lpidProcess, DWORD cb, DWORD*cbNeeded);

    引數lpidProcess:一個足夠大的DWORD型別的陣列,用於存放程序的ID值;引數cb:存放程序ID值的陣列的最大長度,是一個DWORD型別的資料;

    引數cbNeeded:指向一個DWORD型別資料的指標,用於返回程序的數目;

    函式返回值:如果呼叫成功,返回TRUE,同時將所有程序的ID值存放在lpidProcess引數所指向的陣列中,程序個數存放在cbNeeded引數所指向的變數中;如果呼叫失敗,返回FALSE。

    (2)GetModuleFileNameExA()函式可以實現透過程序控制代碼獲取程序檔名,其原型為:

    DWORD GetModuleFileNameExA(HANDLE hProcess, HMODULE hModule,LPTSTR lpstrFileName, DWORD nsize);

    引數hProcess:接受程序控制代碼的引數,是HANDLE型別的變數;

    引數hModule:指標型引數,在本文的程式中取值為NULL;

    引數lpstrFileName:LPTSTR型別的指標,用於接受主調函式傳遞來的用於存放程序名的字元陣列指標;

    引數nsize:lpstrFileName所指陣列的長度;

    函式返回值:如果呼叫成功,返回一個大於0的DWORD型別的資料,同時將hProcess所對應的程序名存放在lpstrFileName引數所指向的陣列中;如果呼叫失敗,則返回0。

    透過下列程式碼就可以遍歷系統中的程序,獲得程序列表:

    //獲取當前程序總數

    EnumProcesses(process_ids, sizeof(process_ids), &num_processes);

    //遍歷程序

    for (int i = 0; i < num_processes; i++)

    {

    //根據程序ID獲取控制代碼

    process[i] = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0,

    process_ids[i]);

    //透過控制代碼獲取程序檔名

    if (GetModuleFileNameExA(process[i], NULL, File_name, sizeof(fileName)))

    cout << fileName << endl;

    }

  • 中秋節和大豐收的關聯?
  • 子宮腺肌症會癌變嗎?