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