• Thứ Ba, 20/09/2011 15:14 (GMT+7)

    Lập trình: Giám sát phần mềm hoạt động

    Nguyễn Văn Hiệp
    Bài viết giới thiệu mã nguồn VB 6.0 (phần mềm A) với chức năng giám sát hoạt động của phần mềm B.

    Yêu cầu từ bạn đọc là khi có sự cố thì phần mềm B phát sinh cảnh báo dạng Popup report, phần mềm A sẽ đọc cảnh báo này và phát thông điệp báo động bằng âm thanh đồng thời gửi tin nhắn cảnh báo tới 1 số điện thoại định trước.

    1. Để kiểm tra xem 1 phần mềm nào đó có đang chạy hay không, bạn có thể gọi các hàm API của Windows như EnumProcesses, OpenProcess, EnumProcessModules, GetModuleFileNameExA. Sau đây là mã nguồn VB 6.0 của hàm kiểm tra xem phần mềm (được xác định bởi đường dẫn file khả thi của nó) có đang chạy hay không:

    Option Explicit
    Option Compare Text
    'khai báo các hàm API cần gọi
    Private Declare Function EnumProcesses Lib "psapi.dll" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
    Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
    Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
    Private Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
    Private Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Long) As Long

    'khai báo kiểu dữ liệu cần dùng
    Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long ' This process
    th32DefaultHeapID As Long
    th32ModuleID As Long ' Associated exe
    cntThreads As Long
    th32ParentProcessID As Long ' This process's parent process
    pcPriClassBase As Long ' Base priority of process threads
    dwFlags As Long
    szExeFile As String * 260 ' MAX_PATH
    End Type

    Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long '1 = Windows 95.
    '2 = Windows NT
    szCSDVersion As String * 128
    End Type

    'khai báo hằng cần dùng
    Const PROCESS_QUERY_INFORMATION = 1024
    Const PROCESS_VM_READ = 16
    Const PROCESS_TERMINATE = 1
    Const MAX_PATH = 260
    Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Const SYNCHRONIZE = &H100000
    Const PROCESS_ALL_ACCESS = &H1F0FFF
    Const TH32CS_SNAPPROCESS = &H2&
    Const hNull = 0

    'hàm kiểm tra xem phần mềm pathname đang chạy không
    Private Function HasProg(pathname As String) As Boolean
    'khai báo biến cần dùng trong hàm
    Dim cb As Long
    Dim cbNeeded As Long
    Dim NumElements As Long
    Dim ProcessIDs() As Long
    Dim cbNeeded2 As Long
    Dim Modules(1 To 200) As Long
    Dim lRet As Long
    Dim ModuleName As String
    Dim nSize As Long
    Dim hProcess As Long
    Dim i As Long
    'tạo array chứa 1000 ID process
    cb = 1000 * 4
    ReDim ProcessIDs(cb / 4) As Long
    'xác định các ID process đang chạy
    lRet = EnumProcesses(ProcessIDs(1), cb, cbNeeded)
    'tính số lượng process
    NumElements = cbNeeded / 4
    'giả định phần mềm cần kiểm tra không chạy
    HasProg = False
    'duyệt xét từng process
    For i = 1 To NumElements
    'lấy handle của Process thứ i
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessIDs(i))
    'kiểm tra handle
    If hProcess <> 0 Then
    'lấy danh sách các module handles thuộc process
    lRet = EnumProcessModules(hProcess, Modules(1), 200, cbNeeded2)
    'nếu có, lấy đường dẫn file khả thi tương ứng
    If lRet <> 0 Then
    ModuleName = Space(MAX_PATH)
    nSize = 500
    lRet = GetModuleFileNameExA(hProcess, Modules(1), ModuleName, nSize)
    'kiểm tra đường dẫn file khả thi
    If Left(ModuleName, lRet) = pathname Then
    HasProg = True
    'đóng handle của process
    lRet = CloseHandle(hProcess)
    Exit Function
    End If
    End If
    End If
    'đóng handle của process
    lRet = CloseHandle(hProcess)
    Next
    End Function

    2. Nếu bạn là người viết phần mềm B thì thay vì phát sinh cảnh báo dạng popup report, bạn nên tạo thẳng báo động bằng âm thanh, đồng thời gởi tin nhắn (chứa nội dung của cảnh báo) tới 1 số điện thoại xác định trước.

    Việc tạo báo động bằng âm thanh có thể được thực hiện bằng các bước sau:

    - Tạo file âm thanh miêu tả âm thanh, cất file này vào vị trí thích hợp trên đĩa.

    - Thêm điều khiển Windows Media Player (WMP) vào form ứng dụng B, thiết lập thuộc tính (Name) = Media, thuộc tính Visible của WMP = false để ẩn nó.
    - Khi cần báo động bằng âm thanh, bạn viết lệnh sau :

    Media.URL = "c:\data\amthanh.wav"

    Việc lập trình gởi tin nhắn đến điện thoại di động khá giống với lập trình gởi e-mail đến account e-mail trong Internet, bạn có thể tìm được đoạn code giải quyết vấn đề này trên Internet. 

    Từ khóa: học lập trình
    ID: A1107_93