Thứ Bảy, 19 tháng 2, 2011

Xuất dữ liệu từ Foxpro sang Excel và chuyển mã Unicode

Bài viết sau đây chúng tôi xin chia sẻ với bạn đọc các bước xuất dữ liệu từ Foxpro sang Excel và chuyển mã Unicode mời bạn đọc tham khảo
1. Copy các record dữ liệu từ file *.dbf sang 1 worksheet Excel. File *.dbf là 1 bảng (table) dữ liệu, worksheet Excel cũng là 1 bảng dữ liệu. Do đó việc chuyển thông tin từ file *.dbf sang worksheet Excel là hoạt động copy dữ liệu từ table này sang table khác. Bạn có thể lập trình dùng các đối tượng ADO để thực hiện hoạt động này. Cách đơn giản nhất là dùng trực tiếp Excel như sau: chạy Excel, chọn menu File.Open để mở file *.dbf và hiển thị lên 1 worksheet Excel. Sau đó, chọn menu File.Save As để lưu lại theo định dạng *.xls.

2. Chuyển mã các chuỗi văn bản trong bảng dữ liệu từ bảng mã này sang bảng mã khác (cụ thể là từ VNI 1 byte sang Unicode). Bạn có thể dùng các ứng dụng chuyển mã tiếng Việt sẵn có trên thị trường để chuyển mã tiếng Việt trực tiếp trong worksheet Excel.

Lưu ý, do bảng mã tiếng Việt VNI-DOS (và một số bảng mã tiếng Việt cũ khác) có dùng một số mã ký tự điều khiển làm ký tự tiếng Việt nên một số ứng dụng bị xử lý sai. Do đó để giải quyết tổng quát và triệt để vấn đề chuyển mã tiếng Việt, chúng tôi có viết 1 đối tượng COM cung cấp các hàm chức năng để chuyển mã tiếng Việt từ bất kỳ bảng mã nào sang một bảng mã khác. Bạn có thể liên hệ với tòa soạn để copy đối tượng này (file bktrans.dll) về cài vào máy và sử dụng. Qui trình cài đặt đối tượng COM vào máy như sau:

- Copy file bktrans.dll vào thư mục thích hợp (thí dụ c:MyCOM).

- Tạo icon shortcut trên màn hình desktop của trình đăng ký components bằng cách ấn phải chuột trên màn hình desktop, chọn option New.Shortcut, duyệt và chọn file c:windowssystem32regsvr32.exe để tạo icon shortcut cho nó.

- Chạy tiện ích duyệt hệ thống file, tìm và hiển thị nội dung thư mục c:MyCOM, thay đổi kích thước/dời vị trí cửa sổ hiển thị thư mục sao cho thấy được icon shortcut của trình đăng ký component, chọn file bktrans.dll, drag nó vào icon shortcut của trình đăng ký để đăng ký nó vào Windows.

- Sau khi đã đăng ký thành công, bạn có thể dùng bất kỳ môi trường lập trình nào (VB, VC++,...) để lập trình ứng dụng và dùng đối tượng Bktrans vừa đăng ký y như dùng các đối tượng COM khác.

Sau đây chúng tôi xin trình bày qui trình điển hình để xây dựng 1 ứng dụng bằng VB 6.0 đọc bảng dữ liệu từ file *.dbf, chuyển mã tiếng Việt từ mã VNI-DOS sang mã Unicode cho bất kỳ field chuỗi nào rồi ghi kết quả lên 1 worksheet Excel:

1. Chạy VB 6.0, tạo Project mới thuộc loại "Standard EXE" (loại Project mặc định có 1 Form giao diện rỗng ban đầu).

2. Chọn menu Project.References để hiển thị cửa sổ References. Duyệt tìm và chọn mục BkTrans 1.0 Type Library để "add" thành phần COM phục vụ chuyển mã tiếng Việt vào Project. Tương tự, duyệt tìm và chọn mục Microsoft ActiveX Data Objects 2.x Library để "add" thành phần COM phục vụ truy xuất database vào Project.

3. Chọn menu Project.Components để hiển thị cửa sổ Components. Duyệt tìm và chọn mục Microsoft Common Dialog Control 6.0 để "add" điều khiển phục vụ duyệt hệ thống file vào Project.

4. Thiết kế Form ứng dụng theo hình sau, gồm có 5 label, 3 textbox, 2 combobox, 3 button và 1 CommonDialog:

Đặt tên cho 3 textbox là txtDBFFile, txtExcelFile, txtWorksheet, tên cho 3 button là btnDBFFile, btnExcelFile, btnStart, tên cho 2 combobox là cbSourceCode, cbDestCode, tên cho CommonDialog là FileDialog.

5. Ấn kép chuột vào button btnDBFFile để tạo thủ tục xử lý sự kiện Click chuột trên nó, tương tự tạo thủ tục xử lý Click chuột cho 2 button còn lại và cho 2 Combobox rồi viết code VB 6.0 sau đây:

Option Explicit
'khai báo các biến cần dùng
Private srcid As Integer
Private dstid As Integer
Private VietLibCOM As New BKTRANSLib.BKTRANSLib
'thủ tục Click button chọn file DBF
Private Sub btnDBFFile_Click()
FileDialog.ShowOpen
txtDBFFile.Text = FileDialog.FileName
End Sub
'thủ tục Click button chọn file Excel
Private Sub btnExcelFile_Click()
FileDialog.ShowOpen
txtExcelFile.Text = FileDialog.FileName
End Sub
'thủ tục Click button bắt đầu chuyển mã & chuyển định dạng
Private Sub btnStart_Click()
'khai báo các biến cần dùng
Dim Connection1 As ADODB.Connection
Dim RecordSet1 As ADODB.Recordset
Dim Connection2 As ADODB.Connection
Dim RecordSet2 As ADODB.Recordset
Dim Command2 As ADODB.Command
Dim path As String, TableName As String
Dim strSQL As String, strbuf As String
Dim sfldbuf As String, dfldbuf As String
Dim i As Integer, j As Integer
Dim fStart As Integer, kq As Long
Dim fld As Variant
'xác định đường dẫn và file DBF
i = 1
Do
j = InStr(i, txtDBFFile.Text, "", vbBinaryCompare)
If (j <> 0) Then
i = j + 1
End If
Loop While j <> 0
'xác định đường dẫn
path = Mid(txtDBFFile.Text, 1, i - 1)
'xác định tên file DBF
TableName = Mid(txtDBFFile.Text, i)
'Tạo connection tới database nguồn
Set Connection1 = New ADODB.Connection
Connection1.Open "Provider=MSDASQL;DRIVER=Microsoft FoxPro VFP Driver (*.dbf);SourceType=DBF;SourceDB=" & path & ";"
'Tạo recordset chứa các record của table nguồn
Set RecordSet1 = New ADODB.Recordset
RecordSet1.Open TableName, Connection1, adOpenStatic, adLockReadOnly, adCmdTable
'Tạo connection tới database đích
Set Connection2 = New ADODB.Connection
Connection2.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & txtExcelFile.Text & ";Extended Properties=Excel 8.0;"
'Tạo command làm việc với database đích
Set Command2 = New ADODB.Command
Command2.ActiveConnection = Connection2
'xây dựng lệnh SQL tạo Table đích
strSQL = "CREATE TABLE " & txtWorksheet.Text & " ("
'duyệt tìm từng field của table nguồn
fStart = 1
For Each fld In RecordSet1.Fields
'tìm tên và kiểu của field
Select Case fld.Type
Case 2
strbuf = "Integer"
Case 3
strbuf = "Long"
Case 5
strbuf = "Currency"
Case 6
strbuf = "Double"
Case 11
strbuf = "Logical"
Case 202
strbuf = "Text"
Case 203
strbuf = "Text"
Case 7
strbuf = "Date"
Case 135
strbuf = "Date"
Case 129
strbuf = "Text"
Case 131
strbuf = "Integer"
Case 133
strbuf = "Date"
Case Else
MsgBox "Type với mã " & fld.Type & " chưa được xử lý!!!"
End Select
If fStart Then
strSQL = strSQL & fld.Name & " " & strbuf
fStart = 0
Else
strSQL = strSQL & ", " & fld.Name & " " & strbuf
End If
Next fld
strSQL = strSQL & ")"
'Xóa table trên database đích nếu có rồi
'Command2.CommandText = "DROP TABLE " & txtWorksheet.Text
'Command2.Execute
'Tạo mới table trên database đích
Command2.CommandText = strSQL
Command2.Execute
'Tạo recordset chứa các record của table đích
Set RecordSet2 = New ADODB.Recordset
RecordSet2.Open txtWorksheet.Text, Connection2, adOpenKeyset, adLockOptimistic, adCmdTable
'duyệt chuyển mã và copy từng record
While Not RecordSet1.EOF
'tạo mới record
RecordSet2.AddNew
For i = 0 To RecordSet1.Fields.Count - 1
'nếu field i là chuỗi thì chuyển mã
If (RecordSet1.Fields(i).Type = 129) Or (RecordSet1.Fields(i).Type = 202) Or (RecordSet1.Fields(i).Type = 203) Then
On Error GoTo AssignIt
sfldbuf = RecordSet1.Fields(i).Value
If Len(sfldbuf) <> 0 Then
kq = VietLibCOM.TransStr(srcid, dstid, sfldbuf, dfldbuf)
RecordSet2.Fields(i).Value = dfldbuf
Else: GoTo AssignIt
End If
Else
'nếu không thì chỉ copy dữ liệu
AssignIt:
RecordSet2.Fields(i).Value = RecordSet1.Fields(i).Value
End If
Next i
'lưu lại record lên table đích
RecordSet2.Update
'di chuyển đến record kế tiếp
RecordSet1.MoveNext
Wend
'đóng các đối tượng sử dụng lại
RecordSet1.Close
Connection1.Close
Connection2.Close
End Sub
'thủ tục Click chọn mã tiếng Việt đích
Private Sub cbDestCode_Click()
dstid = cbDestCode.ListIndex
End Sub
'thủ tục Click chọn mã tiếng Việt gốc
Private Sub cbSourceCode_Click()
srcid = cbSourceCode.ListIndex
End Sub
'thủ tục khởi tạo ban đầu cho ứng dụng
Private Sub Form_Load()
Dim i As Integer
Dim s As String
Dim ret As Integer
Dim cnt As Integer
'xóa trắng nội dung các đối tượng hiển thị
txtDBFFile.Text = ""
txtExcelFile.Text = ""
txtWorksheet.Text = ""
cbSourceCode.Clear
cbDestCode.Clear
'khởi động đối tượng chuyển mã
ret = VietLibCOM.Init()
'tìm số bảng mã được phép xử lý
cnt = VietLibCOM.GetCodeCount()
'hiển thị chúng vào 2 combox để user chọn lựa
For i = 0 To cnt - 1
VietLibCOM.GetCodeName i, s
cbSourceCode.AddItem s
cbDestCode.AddItem s
Next i
End Sub

6. Chọn menu Run.Start để chạy thử ứng dụng, chọn file DBF gốc, chọn file Excel chứa kết quả, chọn mã tiếng Việt gốc, chọn mã tiếng Việt đích, nhập tên worksheet chứa kết quả, chọn button "Bắt đầu copy và chuyển mã file DBF". Sau đó chạy Excel và mở xem thử nội dung file Excel kết quả.

Lưu ý chương trình trên có thể truy xuất bảng dữ liệu của bất kỳ database server nào (FoxPro, Access, Excel, MySQL, SQL, Oracle,...). Bạn chỉ cần hiệu chỉnh chuỗi ConnectionString miêu tả database cần truy xuất cho phù hợp với định dạng database cần truy xuất.

Bạn có thể liên hệ với tòa soạn để copy Project VB 6.0 của ứng dụng chuyển mã (có tên là VBTransDataTable) và file bktrans.dll chứa đối tượng COM phục vụ chuyển mã tiếng Việt.

Theo thanglong-aptech.com

Lấy tên chương trình đang chạy trong máy tính bằng VB

Khi 1 file phần mềm chạy (do yêu cầu người dùng hay do chương trình khác kích hoạt), nó được nạp vào bộ nhớ và trở thành process. Bạn có thể dùng hàm API của Windows có tên là WTSEnumerateProcesses() để thống kê tất cả các process đang chạy trên máy, mỗi process là của file khả thi nào, từ đó quyết định xử lý chúng theo yêu cầu của mình.

Sau đây chúng tôi xin giới thiệu qui trình điển hình để xây dựng ứng dụng VB 6.0 demo việc thống kê tất cả các process đang chạy và hiển thị thông tin về chúng trong một ListVew để người dùng xem:
1. Chạy VB 6.0, tạo Project ứng dụng dạng 'Standard EXE' đơn giản.
2. Chọn menu Project.Components để hiển thị cửa sổ Components, duyệt tìm vào chọn mục Microsoft Window Common Controls 6.0 rồi Ok để thêm các control trong thư viện này vào ToolBox của Project.
3. Thiết kế Form gồm 1 ListView có tên mặc định là ListView1 như hình 4.
4. Chọn menu View.Code để hiển thị cửa sổ soạn mã nguồn cho form rồi viết code cho nó như sau:

Option Explicit
'khai báo hằng và kiểu cần dùng
Private Const WTS_CURRENT_SERVER_HANDLE = 0&
Private Type WTS_PROCESS_INFO
SessionID As Long
ProcessID As Long
pProcessName As Long
pUserSid As Long
End Type
'khai báo các hàm API cần dùng
Private Declare Function WTSEnumerateProcesses Lib 'wtsapi32.dll' Alias 'WTSEnumerateProcessesA' (ByVal hServer As Long, ByVal Reserved As Long, ByVal Version As Long, ByRef ppProcessInfo As Long, ByRef pCount As Long) As Long
Private Declare Sub WTSFreeMemory Lib 'wtsapi32.dll' (ByVal pMemory As Long)
Private Declare Sub CopyMemory Lib 'kernel32' Alias 'RtlMoveMemory' (Destination As Any, Source As Any, ByVal Length As Long)
'hàm tìm chuỗi từ địa chỉ bộ nhớ xác định
Private Function GetStringFromLP(ByVal StrPtr As Long) As String
Dim b As Byte
Dim tempStr As String
Dim bufferStr As String
Dim Done As Boolean
Done = False
Do 'lấy từng byte và xử lý
CopyMemory b, ByVal StrPtr, 1
If b = 0 Then 'kết thúc chuỗi
Done = True
Else
tempStr = Chr$(b)
bufferStr = bufferStr & tempStr
StrPtr = StrPtr + 1 'tăng pointer tới byte kế
End If
Loop Until Done
GetStringFromLP = bufferStr
End Function
'thủ tục khởi động Form
Private Sub Form_Load()
ListView1.View = lvwReport
'tạo header gồm 4 cột thông tin trên ListView
ListView1.ColumnHeaders.Add 1, 'SessionID', 'Session ID'
ListView1.ColumnHeaders.Add 2, 'ProcessID', 'Process ID'
ListView1.ColumnHeaders.Add 3, 'ProcessName', 'Process Name'
ListView1.ColumnHeaders.Add 4, 'UserID', 'User ID'
'thống kê và hiển thị các process
GetWTSProcesses
End Sub
'thủ tục thống kê và hiển thị thông tin các process
Private Sub GetWTSProcesses()
'khai báo các biến cần dùng
Dim RetVal As Long
Dim Count As Long
Dim i As Integer
Dim lpBuffer As Long
Dim p As Long
Dim udtProcInfo As WTS_PROCESS_INFO
Dim itmAdd As ListItem
'xóa nội dung cũ của ListView
ListView1.ListItems.Clear
'thống kê các process
RetVal = WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0&, 1, lpBuffer, Count)
If RetVal = 0 Then 'nếu thất bại
MsgBox 'Error occurred calling WTSEnumerateProcesses. ' & 'Check the Platform SDK error codes in the MSDN Documentation' & ' for more information.', vbCritical, 'Error ' & Err.LastDllError
'dừng thủ tục
Exit Sub
End If
'nếu thống kê được thì lặp hiển thị từng process
p = lpBuffer
For i = 1 To Count
'copy thông tin về process i vào biến udtProcInfo
CopyMemory udtProcInfo, ByVal p, LenB(udtProcInfo)
'thêm hàng thông tin về process i vào ListView
Set itmAdd = ListView1.ListItems.Add(i, , CStr(udtProcInfo.SessionID))
itmAdd.SubItems(1) = CStr(udtProcInfo.ProcessID)
itmAdd.SubItems(2) = GetStringFromLP(udtProcInfo.pProcessName)
itmAdd.SubItems(3) = CStr(udtProcInfo.pUserSid)
'hiệu chỉnh p về vị trí miêu tả process kế tiếp
p = p + LenB(udtProcInfo)
Next i
Set itmAdd = Nothing
'giải phóng bộ nhớ
WTSFreeMemory lpBuffer
End Sub

Lưu ý tên file khả thi của process được chứa trong trường udtProcInfo.pProcessName.
5. Chọn menu Run.Start để chạy thử Form vừa xây dựng và xem danh sách các process đang chạy trên máy.

Theo pcworld

Nguồn bài viết: thanglong-aptech.com

Chuyển đổi biểu thức thành tổng giá trị

Xin hướng dẫn cách đổi một chuỗi dạng công thức sang số (ví dụ chuỗi (3+2)*2, sau khi biến đổi sẽ là 10).

Trả lời :

Yêu cầu của bạn thuộc dạng viết chương trình dịch. Để giải quyết tốt và tổng quát được vấn đề, trước hết bạn phải định nghĩa cú pháp được dùng để xây dựng công thức. Sau khi có cú pháp xây dựng công thức, bạn sẽ viết 2 module sau để phục vụ dịch công thức sang giá trị cuối cùng của nó:

- Module xử lý từ vựng, module này có nhiệm vụ chuyển công thức từ dạng chuỗi ký tự thô sang chuỗi token có nghĩa. Bạn có thể dùng công cụ Lex để xây dựng module này dễ dàng.
- Module xử lý cú pháp, module này có nhiệm vụ chuyển công thức từ dạng chuỗi token sang dạng cây cú pháp, nhờ đó thực hiện tính giá trị của công thức được dễ dàng. Bạn có thể dùng công cụ Yacc để xây dựng module này.

Cụ thể, nếu ta định nghĩa cú pháp của công thức ở mức đơn giản như sau:
hằngsố = chuỗi từ 1 tới n ký số thập phân
toántử = + | - | * | /
dấu ngăn = ( | )
côngthức = hằngsố
| (côngthức)
| côngthức + côngthức
| côngthức - côngthức
| côngthức * côngthức
| côngthức / côngthức
1. Ta có thể dùng ngôn ngữ đặc tả Lex để đặc tả các biểu thức chính qui miêu tả các token được dùng để xây dựng công thức như sau:

include "expr.h"
%%
[0-9]* { yylval.ival = atoi(yytext);
return ICONST; }
"*" { return MUL; }
"-" { return SUB; }
"+" { return ADD; }
"/" { return DIV; }
"(" { return LPAR; }
")" { return RPAR; }
. { }
%%

Cất đoạn lệnh trên vào file expr.l. Lưu ý rằng để hiểu và viết được các lệnh Lex đặc tả các token, bạn cần phải biết cú pháp của ngôn ngữ Lex (vốn rất dễ hiểu).

2. Soạn nội dung file expr.h như sau để phục vụ cho file expr.l ở trên:
//đoạn code C định nghĩa 1 số kiểu và hằng cần dùng

typedef union {
char* s;
int ival;
int t;
} YYSTYPE;
extern YYSTYPE yylval;
# define ICONST 257
# define ADD 258
# define SUB 259
# define DIV 260
# define MUL 261
# define LPAR 262
# define RPAR 263
3. Tương tự, ta có thể dùng ngôn ngữ đặc tả Yacc để đặc tả cú pháp của công thức và tính giá trị công thức như sau:
%{
//đoạn code C chứa các hàm dịch vụ
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
extern FILE* yyin;
char pexpr[256];
int ketqua;
void yyerror(char* ps) {
printf("%s",ps);
}
%}
%union {
char* s;
int ival;
int t;
}
%token ICONST ADD SUB DIV MUL LPAR RPAR
%type Expr ICONST
%type ADD SUB MUL DIV LPAR RPAR
%left ADD SUB
%left MUL DIV
%start Expr
%%
Expr : ICONST
{ $$ = yylval.ival; ketqua = $$;}
| LPAR Expr RPAR
{ $$ = $2; ketqua = $$;}
| Expr ADD Expr
{ $$ = $1 + $3; ketqua = $$;}
| Expr SUB Expr
{ $$ = $1 - $3; ketqua = $$;}
| Expr DIV Expr
{ $$ = $1 / $3; ketqua = $$;}
| Expr MUL Expr
{ $$ = $1 * $3; ketqua = $$;}
;
%%
//chương trình tính công thức được viết bằng C
void main(int argc, char* argv[]) {
loop:
printf("Nhập biểu thức cần tính : ");
scanf("%s",pexpr);
// Cất chuỗi ký tự miêu tả công thức lên file
remove("ftmp.txt");
yyin = fopen("ftmp.txt","w");
fprintf(yyin,"%sn",pexpr);
fclose(yyin);
// Mở lại file chứa công thức
yyin = fopen("ftmp.txt","r");
// Phân tích biểu thức và tính kết quả
yylex_init();
yyparse();
printf("Biểu thức vừa nhập có giá trị là : %dn",ketqua);
goto loop;
}

Cất đoạn lệnh trên vào file expr.y. Lưu ý rằng để hiểu và viết được các lệnh Yacc đặc tả cú pháp, bạn cần phải biết cú pháp của ngôn ngữ Yacc (vốn khá dễ hiểu).

4. Soạn đoạn script sau để dịch tự động các file ra chương trình khả thi và lưu lên file có tên là makefile:

CFLAGS= -c -g255 -v -ml -C -Ic:bc31include
LFLAGS= -ml -v -Lc:bc31lib
CC= bcc
GRAPH= c:bc31libgraphics.lib
yacc= c:Toolsfyacc
lex= c:Toolsflex
expr: expr.obj exprlex.obj
$(CC) -eexpr $(LFLAGS) expr.obj exprlex.obj
expr.obj: expr.c expr.h
$(CC) $(CFLAGS) expr.c
exprlex.obj: exprlex.c expr.h
$(CC) $(CFLAGS) exprlex.c
expr.c: expr.y
$(yacc) -vdl expr.y
del expr.c
ren ytab.c expr.c
del expr.h
ren ytab.h expr.h
exprlex.c: expr.l
$(lex) -tl expr.l >exprlex.c

Đoạn script trên sẽ dùng chương trình dịch BorlandC được cài đặt vào thư mục c:bc31, nó cũng dùng 2 tiện ích Flex và Fyacc được cài đặt ở thư mục c:Tools. (Bạn có thể tải về từ website TGVT 2 tiện ích này, với tên file lần lượt là Bison111.zip và flex251.zip).

4. Chạy tiện ích Start.All Program.Accessories.Command Prompt, nhập và thực hiện các lệnh sau:
c:>cd exprcalc
c:exprcalc>make expr
5. Sau khi biên dịch ra file chương trình có tên là expr.exe, bạn có thể chạy thử ứng dụng rồi nhập thử từng công thức cần tính và xem kết quả

Theo pcworld

Nguồn : thanglong-aptech.com

Truy vấn có tham số từ form trong Visual Foxpro 6.0

Trong lúc lập trình, chúng ta thường phải xây dựng các lệnh truy vấn theo nội dung động do người dùng nhập vào. Ngôn ngữ FoxPro (và các ngôn ngữ lập trình khác) cho phép ta thực hiện điều này dễ dàng.

Thí dụ ta thiết kế 1 Form FoxPro đơn giản gồm 1 textbox có tên là txtHoten và 1 button có tên là btnSearch, đoạn code FoxPro sau (nằm trong thân thủ tục xử lý sự kiện click chuột vào button btnSearch) sẽ tạo lệnh truy vấn Select để tìm các record của bảng table1 trong file database data1.dbc mà nội dung trường hoten có chứa chuỗi nhập vào textbox txtHoten:

*khai báo biến cần dùng
public shoten
*mở database cần dùng
open database c:datadata1.dbc
*chứa chuỗi nhập vào biến
shoten = ALLTRIM(thisform.txtHoten.Text)
*thực hiện tìm kiếm
Select * from table1 where hoten like '%&str%'

Lưu ý, trong lệnh Select (hay bất kỳ lệnh truy vấn SQL nào), bạn có thể chèn nội dung động bằng cách dùng cú pháp &ten, trong đó ten là tên biến chứa nội dung chuỗi động cần dùng.

Theo pcworld

Nguồn : Thanglong-Aptech.com

Tài liệu cần thiết để lập trình VC++ 6.0

Bài viết sau đây sẽ giới thiệu với bạn đọc một số tài liệu cần thiết để lập trình VC++ 6.0 xem các thông tin về hệ thống máy tính?

Bạn có thể gọi hàm API Windows có tên là GetSystemInfo() và những hàm liên quan để truy xuất các thông tin về hệ thống máy tính đang chạy của bạn. Thông tin cụ thể và chi tiết về hàm GetSystemInfo() và những thí dụ về việc dùng hàm này được trình bày trong MSDN của Microsoft. Sau đây là qui trình điển hình để xây dựng ứng dụng VC++ hiển thị một số thông tin cơ bản của máy tính:

1. Chạy VC++ 6.0, chọn menu File.New để hiển thị cửa sổ New, chọn tab Projects, chọn loại MFC AppWizard (EXE), chọn vị trí thư mục chứa Project, nhập tên Project (thí dụ DispSysInfo) rồi chọn button Ok để tạo Project.
2. Khi cửa sổ Step 1 hiển thị, bạn chọn option Dialog Based rồi button Finish để tạo ứng dụng chứa 1 Form đơn giản.
3. Thiết kế Form chứa 1 button với Caption = 'DispSysInfo' như hình 2.
4. Nhấn đúp chuột vào button vừa tạo để tạo hàm xử lý sự kiện click chuột trên button rồi viết code cho hàm như sau:

void CDispSysInfoDlg::OnButton1() {
//tìm handle của form giao diện
HDC hdc = this->GetWindowDC()->m_hDC;
SYSTEM_INFO siSysInfo; //cấu trúc chứa các thông tin
int aTabs[1] = {260}; //tab stop cho hàm TabbedTextOut
TCHAR tchBuffer[256]; //buffer chứa chuỗi
int nSize; //kích thước string
//Hiển thị header của bàng thông tin
nSize = sprintf(tchBuffer,'Hardware information:');
TextOut(hdc, 15, 60, tchBuffer, nSize);
//nhờ hệ thống lấy thông tin chứa vào biến siSysInfo.
GetSystemInfo(&siSysInfo);
//Hiển thị 1 số thông tin hệ thống tìm được
nSize = sprintf(tchBuffer,
'OEM ID: %utNumber of Processors: %u', siSysInfo.dwOemId,
siSysInfo.dwNumberOfProcessors);
TabbedTextOut(hdc, 25, 80, tchBuffer, nSize, 1, aTabs, 25);
nSize = sprintf(tchBuffer,
'Page size: %utProcessor Type: %u',
siSysInfo.dwPageSize,
siSysInfo.dwProcessorType);
TabbedTextOut(hdc, 25, 100, tchBuffer, nSize, 1, aTabs, 25);
nSize = sprintf(tchBuffer,
'Minimum app address: %lxtMaximum app address: %lx',
siSysInfo.lpMinimumApplicationAddress,
siSysInfo.lpMaximumApplicationAddress);
TabbedTextOut(hdc, 25, 120, tchBuffer, nSize, 1, aTabs, 25);
nSize = sprintf(tchBuffer,
'Active processor mask: %u',
siSysInfo.dwActiveProcessorMask);
TextOut(hdc, 25, 140, tchBuffer, nSize);
}

5. Chọn menu Build.Execute DispSysInfo.exe để chạy ứng dụng, nhấn vào button DispSysInfo, một số thông tin hệ thống sẽ hiển thị lên Form.

Theo pcworld

Nguồn : Thanglong-Aptech

Chủ Nhật, 30 tháng 1, 2011

Những phần mềm diệt virus Antivirus miễn phí của năm 2011

Với khả năng quét và phát hiện cao, cùng với giao diện thân thiện, Avast Free Antivirus đã đứng đầu trong bảng xếp hạng này; Avira AntiVir Personal đứng thứ 2 nhưng cũng có khả năng phát hiện và loại bỏ phần mềm độc hại một cách hiệu quả.

Avast Free Antivirus 5

Avast Free Antivirus là một bộ gói sản phẩm chống virus toàn diện: nó là một bức tường vững chắc trong việc ngăn chặn các phần mềm độc hại; với một giao diện thân thiện dễ sử dụng, nó cho phép người dùng quét các tập tin một cách nhanh chóng.

1296026487 vi tinh avast free antivirus 5 Những phần mềm diệt virus Antivirus miễn phí của năm 2011

Avira AntiVir Personal Free Antivirus 10

Avira AntiVir Personal có khả năng ngăn chặn và phát hiện phần mềm đọc hại một cách tuyệt vời, tuy nhiên giao diện chưa được thân thiện cho lắm.

Microsoft Security Essentials 1,0

Microsoft Security Essentials là một thành phần dễ sử dụng, tuy nhiên nó lại thua các sản phẩm trên về khả năng phát hiện các phần mềm độc hại.

Panda Cloud Antivirus

Panda Cloud Antivirus rất dễ sử dụng nhưng tốc độ quét của nó chậm hơn so với bình thường. Hãy tìm bản cập nhật Cloud Antivirus 1,3 để có thể cải thiện khả năng ngăn chặn các cuộc tấn công.

Comodo Internet Security 5,0 Premium

Comodo Internet Security đã làm tốt việc ngăn chặn phần mềm độc hại với thành phần tường lửa, tuy nhiên nó lại chưa phải giải pháp toàn vẹn trong việc phát hiện thành phần độc hại trên máy.

Theo 24h

Nguồn : Những phần mềm diệt virus Antivirus miễn phí của năm 2011