Đăng Nhập

Vui lòng khai báo chính xác tên truy cập và mật khẩu!

Quên mật khẩu?

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

      Admin
      Admin

      Giới tính : Nam

      Đến từ : TPHCM

      Ngày Tham gia : 03/04/2011

      Tổng số bài gửi : 2292

      #1

       Fri Sep 23, 2011 9:35 pm

      Lập trình: Giám sát phần mềm hoạt động
      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.

      pcworld.com.vn