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