Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Cách lấy ID của một tiến trình (ProcessID) trong C++?

  1. #1
    Ngày gia nhập
    11 2006
    Bài viết
    3

    Mặc định Cách lấy ID của một tiến trình (ProcessID) trong C++?

    Xin các bạn chỉ giúp làm thế nào để lấy ID của một tiến trình
    khi biết tên của tiến trình đó ,
    và làm thế nào để khi chọn tên một ứng dụng từ listbox
    rồi click nút đóng thì lập tức thoát chương trình.
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 04-01-2009 lúc 11:21 PM.

  2. #2
    Ngày gia nhập
    07 2006
    Bài viết
    166

    Đại loại là thế này:
    C++ Code:
    1.     // Get all Process
    2.     HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    3.     PROCESSENTRY32* processInfo=new PROCESSENTRY32;
    4.     processInfo->dwSize=sizeof(PROCESSENTRY32);
    5.     DWORD ProcessID = 0x0000;
    6.     wchar_t ProcessName[MAX_PATH];
    7.     while(Process32Next(hSnapShot,processInfo)!=FALSE)
    8.     {
    9.         swprintf(ProcessName, L"%s", processInfo->szExeFile);
    10.         wcscpy(ProcessName, _wcslwr(ProcessName));
    11.         if (wcsstr(ProcessName, L"iexplore.exe") || wcsstr(ProcessName, L"firefox.exe"))
    12.                 // Ở đây là lấy processID của iexplorer hoặc firefox
    13.         {
    14.             ProcessID = processInfo->th32ProcessID;
    15.             break;
    16.         }
    17.            
    18.     }

    còn đóng Process lại thì dùng:
    C++ Code:
    1. BOOL TerminateProcess(
    2.   HANDLE hProcess, // handle to the process
    3.   UINT uExitCode   // exit code for the process
    4. );
    còn làm thế nào để lấy handle process để cho vào hàm kia thì dùng:
    C++ Code:
    1. HANDLE OpenProcess(
    2.   DWORD dwDesiredAccess,  // access flag
    3.   BOOL bInheritHandle,    // handle inheritance option
    4.   DWORD dwProcessId       // process identifier
    5. );
    còn chọn cái gì gì đó ở listbox thì bạn phải xem cách sử dụng listbox thôi
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 04-01-2009 lúc 11:21 PM.

  3. #3
    Ngày gia nhập
    11 2006
    Bài viết
    75

    C++ Code:
    1. //Reference: MSDN
    2. //http://msdn2.microsoft.com/en-us/library/ms686714.aspx --> terminate process
    3. //http://msdn2.microsoft.com/en-gb/library/ms682629.aspx
    4. //http://msdn2.microsoft.com/en-gb/library/ms682631.aspx
    5. //Some other links on MSDN website
    6. //Please, visit MSDN website for more detailed information
    7.  
    8. #define UNICODE
    9. #ifdef UNICODE
    10. #define _UNICODE
    11. #endif
    12.  
    13. #define DEV_CPP
    14.  
    15. #include <windows.h>
    16. #include <stdio.h>
    17. #include <stdlib.h>
    18. #include <tchar.h>
    19.  
    20. #ifdef VISUAL_CPP
    21. #define NOT_USE_DEV_CPP
    22. #include <psapi.h>//-->For using EnumProcesses,...Source:MSDN
    23. #endif
    24.  
    25. #ifdef NOT_USE_DEV_CPP
    26. #undef DEV_CPP
    27. #endif
    28.  
    29. #ifdef DEV_CPP
    30. #define EnumProcesses pfnEnumProcesses
    31. #define EnumProcessModules pfnEnumProcessModules
    32. #define GetModuleBaseName pfnGetModuleBaseName
    33. #endif
    34.  
    35. #ifdef DEV_CPP
    36. typedef int (WINAPI *PFNINT_PSAPI_EP) (DWORD*, DWORD, DWORD*);
    37. PFNINT_PSAPI_EP pfnEnumProcesses=NULL;
    38. typedef int (WINAPI *PFNINT_PSAPI_EPM) (HANDLE, HMODULE*, DWORD, DWORD*);
    39. PFNINT_PSAPI_EPM pfnEnumProcessModules=NULL;
    40. typedef int (WINAPI *PFNINT_PSAPI_GMBN) (HANDLE, HMODULE, LPTSTR, DWORD);
    41. PFNINT_PSAPI_GMBN pfnGetModuleBaseName=NULL;
    42. #endif
    43.  
    44. HINSTANCE hLibrary=NULL;
    45.  
    46. BOOL GetProcessIdByName(LPTSTR lpszCheckedProcessName, DWORD& dwProcessID)
    47. {
    48.     DWORD aProcesses[1024];
    49.     DWORD cbNeeded, cProcesses;
    50.     unsigned int i;
    51.  
    52.     //Find all running processes
    53.     if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    54.     {
    55.         MessageBox(NULL,TEXT("Error when executing EnumProcesses function"),TEXT("Error"),MB_ICONERROR);
    56.         return FALSE;
    57.     }
    58.  
    59.     //Calculate how many process identifiers were returned.
    60.     cProcesses = cbNeeded / sizeof(DWORD);
    61.     //It is a good idea to use a large array,
    62.     //because it is hard to predict how many processes
    63.     //there will be at the time you call EnumProcesses.
    64.     //To determine how many processes were enumerated,
    65.     //divide the pBytesReturned value (cbNeeded) by sizeof(DWORD).
    66.     //There is no indication given when the buffer is too small to store all process identifiers.
    67.     //Therefore, if pBytesReturned (cbNeeded) equals cb (sizeof(aProcesses)), consider retrying the call with a larger array.
    68.     //Source:MSDN
    69.  
    70.     HANDLE hProcess;
    71.     HMODULE hMod;
    72.     TCHAR szProcessName[MAX_PATH];
    73.    
    74.     for ( i = 0; i < cProcesses; i++ )
    75.     {
    76.         if(aProcesses[i]!=0)
    77.         {
    78.             hProcess=OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, aProcesses[i]);
    79.             if(hProcess)
    80.             {
    81.                 if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
    82.                 {
    83.                     GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
    84.                     if(_tcscmp(szProcessName,lpszCheckedProcessName)==0)
    85.                     {
    86.                         dwProcessID=aProcesses[i];
    87.                         return TRUE;
    88.                     }
    89.                 }
    90.             }
    91.         }
    92.     }
    93.  
    94.     //Warning:An application may have multiple instances.
    95.     //If you want to save all processids, you should use an array instead
    96.     return FALSE;
    97. }
    98.  
    99. void PrintProcessNameAndID( DWORD processID )
    100. {
    101.     TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
    102.     //MAX_PATH = 260
    103.     // Get a handle to the process.
    104.  
    105.     HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
    106.                                    PROCESS_VM_READ,
    107.                                    FALSE, processID );
    108.  
    109.     // Get the process name.
    110.     if (NULL != hProcess )
    111.     {
    112.         HMODULE hMod;
    113.         DWORD cbNeeded;
    114.  
    115.         if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
    116.              &cbNeeded) )
    117.         {
    118.             GetModuleBaseName( hProcess, hMod, szProcessName,
    119.                                sizeof(szProcessName)/sizeof(TCHAR) );
    120.         }
    121.     }
    122.  
    123.     // Print the process name and identifier.
    124.     _tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );
    125.     CloseHandle( hProcess );
    126. }
    127.  
    128.  
    129. int main( )
    130. {
    131.  
    132. #ifdef DEV_CPP
    133.     hLibrary=LoadLibrary(TEXT("psapi.dll"));
    134.     if(hLibrary==NULL)
    135.        {
    136.           MessageBox(NULL,TEXT("Error when loading DLL"),TEXT("Msg"),MB_ICONERROR);
    137.           return 0;
    138.        }
    139.  
    140.     EnumProcesses = (PFNINT_PSAPI_EP) GetProcAddress (hLibrary, "EnumProcesses");
    141.     EnumProcessModules = (PFNINT_PSAPI_EPM) GetProcAddress (hLibrary, "EnumProcessModules");
    142.     #ifndef UNICODE
    143.     GetModuleBaseName = (PFNINT_PSAPI_GMBN) GetProcAddress (hLibrary, "GetModuleBaseNameA");
    144.     #else
    145.     GetModuleBaseName = (PFNINT_PSAPI_GMBN) GetProcAddress (hLibrary, "GetModuleBaseNameW");
    146.     #endif
    147.     if((EnumProcesses==NULL)||(EnumProcessModules==NULL)||(GetModuleBaseName==NULL))
    148.        {
    149.           MessageBox(NULL,TEXT("Error when loading function"),TEXT("Msg"),MB_ICONERROR);
    150.           return 0;
    151.        }
    152. #endif
    153.  
    154.     // Get the list of process identifiers.
    155.     DWORD aProcesses[1024], cbNeeded, cProcesses;
    156.     unsigned int i;
    157.  
    158.     if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    159.         return 0;
    160.  
    161.     // Calculate how many process identifiers were returned.
    162.     cProcesses = cbNeeded / sizeof(DWORD);
    163.  
    164.     // Print the name and process identifier for each process.
    165.     for ( i = 0; i < cProcesses; i++ )
    166.         if( aProcesses[i] != 0 )
    167.             PrintProcessNameAndID( aProcesses[i] );
    168.  
    169.     DWORD dwProcessId=0;
    170.     unsigned int uiRadix=10;
    171.     TCHAR szProcessId[10];
    172.  
    173.     if(GetProcessIdByName(TEXT("iexplore.exe"),dwProcessId))
    174.        {
    175.            _ltot(dwProcessId,szProcessId,uiRadix);//convert dwProcessId to string
    176.            MessageBox(NULL,szProcessId,TEXT("This is the ProcessID of iexplore.exe"),MB_OK);
    177.            HANDLE hp = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE,FALSE,dwProcessId);
    178.            if(hp)
    179.                {
    180.                    if(TerminateProcess(hp,0))
    181.                        MessageBox(NULL,TEXT("iexplore.exe terminated successfully"),TEXT("Message"),MB_OK);
    182.                }
    183.            CloseHandle(hp);
    184.        }
    185.  
    186. #ifdef DEV_CPP
    187.     FreeLibrary(hLibrary);
    188. #endif
    189.     return 0;
    190. }

    Chương trình này tôi viết trên DevC++ bản 4.0 ngoài hàng net do máy tính đang trục trặc. Vì vậy, nếu bạn sử dụng các chương trình biên dịch khác để thử lại, bạn có thể phải chỉnh lại một số chi tiết trong mã nguồn khi biên dịch. Nên xem lại một số đường link mà tôi gợi ý cho bạn.

    Mặt khác, bạn hãy vào Google tìm kiếm với cụm từ khóa "Killing Process in C++". Bạn sẽ thấy có nhiều đường link rất hữu dụng trả về (có cả ví dụ mẫu).

    Để giải quyết yêu cầu của bạn, ta cần duyệt qua tất cả các processes đang chạy để tìm ra process có tên trùng với tên của process cần kiểm tra. Chú ý: app có thể có nhiều instance --> nhiều processid tương ứng với một process name.

    Bạn nào có phương pháp giải quyết hay hơn hãy post cho anh em cùng tham khảo.

    Enjoy!
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 04-01-2009 lúc 11:23 PM.

  4. #4
    No Avatar
    instcode Khách

    Có vài cách để liệt kê processes trong Windows:
    - Dùng ToolHelp32 API
    - Dùng PSAPI library
    - Dùng *Performance Counter* infor trong registry (Task Manager xài cái này)
    - Dùng Windows Management Instrumentation (COM)
    - Dùng kernel API: ZwQuerySystemInformation

    Mấy cái này moi ra trong notebook hồi xưa của instcode, kô biết giờ có cách gì nữa kô, các bạn có thể google để xem thêm.

    Ngoài ra, khi compare một cái module/process name thì phải để ý đến trường hợp 8.3 và long name, khi đó phải sử dụng thêm API GetLongPathName().

  5. #5
    Ngày gia nhập
    07 2006
    Bài viết
    166

    À, bổ sung thêm chút:
    ToolHelp32 thì dùng được cho cả Win9x nữa trong khi PSAPI thì chỉ dùng được cho WinNT4

Các đề tài tương tự

  1. Dịch các bài hướng dẫn trong C# từ tiếng Việt sang tiếng Anh!!!
    Gửi bởi khoaimon trong diễn đàn English for IT | Tiếng anh cho dân CNTT
    Trả lời: 10
    Bài viết cuối: 06-01-2011, 11:27 AM
  2. Code chương trình giao tiếp giứa 2 tiến trình trong Windows
    Gửi bởi cutithongtin trong diễn đàn Thắc mắc chung
    Trả lời: 14
    Bài viết cuối: 19-04-2010, 08:51 AM
  3. function "Get ProcessId By ThreadId" in Kernel Mode
    Gửi bởi gianghoplus trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 25-03-2010, 05:15 PM
  4. Làm sao lấy ProcessID của chính tiền trình của mình đang chạy
    Gửi bởi so0_lanhlung trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 17-12-2009, 09:48 AM
  5. Học tiếng Anh | Bí quyết trong học tiếng Anh.
    Gửi bởi Kevin Hoang trong diễn đàn English for IT | Tiếng anh cho dân CNTT
    Trả lời: 22
    Bài viết cuối: 13-04-2009, 08:26 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn