• Chủ Nhật, 21/12/2003 17:34 (GMT+7)

    Câu hỏi :
    • Xin hỏi trong VC++ dùng hàm nào để xem những tiến trình đang chạy, tức là lấy những nội dung bên trong của một Process control block (trên Windows 98). Nếu có thể xin cho đoạn code mẫu. • Làm thế nào để lấy được handle của 1 chương trình đang chạy, nếu chương trình đó chưa chạy thì trả về 0.

    Trả lời :
     

    Khi chương trình chưa chạy, ta nhận dạng nó thông qua đường dẫn miêu tả file *.exe của chương trình trên đĩa cứng (hay thông qua tên file *.exe). Khi chương trình được chạy, nó trở thành process do HĐH quản lý, ta nhận dạng process bằng ID (tên nhận dạng dưới dạng số nguyên) hay handle của nó. Để kiểm tra xem 1 chương trình nào đó đang chạy hay không, bạn có thể gọi 3 hàm API của Windows sau đây:

    • Hàm CreateToolhelp32Snapshot() cho phép chụp lại danh sách các process hiện hành của hệ thống (vì số lượng process và tên process biến đổi liên tục).

    • Hàm Process32First() cho phép lấy thông tin của process đầu tiên trong danh sách.

    • Hàm Process32Next() cho phép lấy thông tin của process kế tiếp trong danh sách.

    Đoạn code C++ sau miêu tả hàm FindProcess() theo yêu cầu của bạn, nó nhận tên file khả thi của chương trình cần kiểm tra và trả về ID của process tương ứng, nếu chương trình chưa chạy thì nó trả về NULL.

    #include <tlhelp32.h>  // for Windows 95

    DWORD FindProcess(LPSTR procname) {

    HANDLE hProcessSnap;

    PROCESSENTRY32 pe32;

    LPSTR ps, pCurChar;

    char fname[256];

        // chuyển tên file thành chữ hoa

        strcpy(fname,procname);

        for (ps = fname; *ps != 0; ps++)

             *ps = toupper(*ps);

        // Chụp snapshot chứa tất cả process hiện hành.

        hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

        if (hProcessSnap == (HANDLE)-1) return 0;

        // Duyệt danh sách và tìm process mong muốn.

        pe32.dwSize = sizeof(PROCESSENTRY32); 

        if (Process32First(hProcessSnap, &pe32)) do {

           // tách tên file ra khỏi pathname

           for (pCurChar = (pe32.szExeFile + lstrlen (pe32.szExeFile));

               *pCurChar != ‘\\’ && pCurChar != pe32.szExeFile; 

               —pCurChar) ;

      // chuyển thành chữ hoa tên file

      for (ps = ++pCurChar; *ps != 0; ps++)

            *ps = toupper(*ps);

      // so sánh tên file

      if (strcmp(fname,pCurChar)==0) {

          CloseHandle (hProcessSnap);

          return pe32.th32ProcessID;

          }

        } while (Process32Next(hProcessSnap, &pe32));

        // đóng handle miêu tả danh sách process  

        CloseHandle (hProcessSnap);

        return 0;

    }

    Chuyên mục: Lập trình