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

Thứ Bảy, 29 tháng 1, 2011

Cách kiểm tra bảo mật trình duyệt web

Cũng giống như các phần mềm, mã code của trình duyệt Web có thể bị tấn công hoặc chứa những lỗ hổng dễ bị hacker hướng tới.Sau đây chúng tôi xin chia sẻ với bạn đọc một số cách kiểm tra bảo mật trình duyệt web

1. Browserscope

Khi truy cập trang web Browserscope, điều đầu tiên bạn thấy là kết quả kiểm tra về việc so sánh rất nhiều khía cạnh của một trình duyệt web cơ bản. Do bài báo này nói về vấn đề bảo mật của trình duyệt web, nên chúng ta sẽ chỉ tập trung vào thẻ Sercurity. Như chúng ta mong đợi, có rất nhiều kiểm tra chỉ trong một thẻ

3 Cách kiểm tra bảo mật trình duyệt web

Trang web cũng sẽ cho phép bạn kiểm tra trình duyệt web hiện tại của bạn. Sau đó, Browserscope sẽ thêm kết quả kiểm tra vào trong danh sách.

2. BrowserSPY.dk

31 Cách kiểm tra bảo mật trình duyệt web

Trang web này thực hiện các kiểm tra tương tự với Browserscope, nhưng có thêm 64 cuộc kiểm tra. Tuy nhiên, không may mắn là BrowserSPY không đưa ra các phương pháp khắc phục.

3. PC Flank - http://www.pcflank.com/

32 Cách kiểm tra bảo mật trình duyệt web

Trang web PC Flank sử dụng một số kiểm tra để hiển thị chung về tình trạng an toàn của máy tính khi xem các trang web. Các kiểm tra bao gồm Stealth Test, Advanced Port Scanner Test, Trojans Test, Exploits Test, và Browser Test. Với Browser Test, PC Flank sẽ cố gắng xác định liệu trình duyệt web của bạn có đưa ra bất kì một thông tin cá nhân, thông tin địa điểm hoặc ISP của bạn.
Kết quả trong hình minh họa cho thấy những gì đang xảy ra trên trình duyệt web của chúng tôi. Cookies được phép lưu lại và những thông tin liên quan được hiển thị trên trang web chúng tôi đang xem.

4. Qualys BrowserCheck

33 Cách kiểm tra bảo mật trình duyệt web

Nếu bạn không ngại, Qualys BrowserCheck cần phải cài đặt một plug-in. Đây chính là cách để nó tìm kiềm những điểm yếu của trình duyệt web, kết hợp các mở rộng và các ứng dụng phụ. Kiểm tra add-ons có vẻ như rất khó khăn nhưng thực sự không phải. những kẻ tấn công cố gắng tìm kiếm mã TPV bị lỗi để có thể thực hiện tấn công vào lỗ hổng này.

5.Scanit Browser Security Check

33 Cách kiểm tra bảo mật trình duyệt web

Là một công ty, Scanit thực hiện tất cả những kiểm tra liên quan tới an ninh, từ kiểm tra thâm nhập để đảm bảo ứng dụng web được an toàn. Họ cũng cung cấp một phiên bản kiểm tra bảo mật trên web, có thể tìm kiếm 19 lỗ hổng.

Kết luận

35 Cách kiểm tra bảo mật trình duyệt web

Ngày nay, chúng ta phải rất cẩn thận trong việc tin tưởng ai và tin tưởng điều gì. Giữ những điều này trong đầu, chúng ta đã có những thông tin về kiểm tra trình duyệt web có thể tin tưởng được. Những trang web trên là 5 lựa chọn tốt nhất chúng ta có thể sử dụng.

Lamle (Techrepublic.com)

Nguồn : Cách kiểm tra bảo mật trình duyệt web

Cách đặt mật khẩu cho trang web hay thư mục trong website

 Trước tiên, chúng ta tạo tệp .htpasswd chứa tên và mật khẩu người dùng áp dụng cho máy chủ Apache 1.3.23 trên máy cục bộ với hệ điều hành Windows XP SP2.

username1:password1
username2:password2

trong đó mật khẩu password1, password2,… đã được mã hóa.

Có nhiều cách để tạo tệp này. Có thể truy cập vào 1 số trang web trợ giúp, trong đó chỉ cần nhập tên và mật khẩu là được, trang web sẽ tự động mã hóa và tạo ra file cần thiết, bạn chỉ cần sao chép nó là được. Tuy nhiên cách làm này đôi khi tạo ra mật khẩu không thích hợp với hệ thống của bạn. Nguyên nhân có thể là do các phiên bản Apache trên máy chủ của bạn và máy chủ của trang web đó khác nhau. Tốt nhất là nên dùng chương trình tạo mật khẩu có sẵn trên máy chủ Apache của bạn.

Tìm trong thư mục cài Apache thư mục tên bin (trên máy cục bộ của mình là C:/Apache/bin) tệp htpasswd.exe. Mở StartRun và gõ cmd để mở Command Prompt. Trong cửa sổ Command Prompt chuyển đường dẫn đến thư mục bin vừa tìm thấy bằng lệnh cd (ví dụ trên máy mình là cd C:Apachebin).

Sau đó chạy dòng lệnh sau để tạo tệp .htpasswd chứa mật khẩu:

htpasswd.exe -mc .htpasswd username

trong đó username là tên người dùng muốn tạo ra. Khi thực hiện dòng lệnh này, sẽ có yêu cầu nhập và xác nhận mật khẩu, chỉ cần nhập theo hướng dẫn đó là được.

Nếu muốn bổ xung thêm người dùng vào file đó thì dùng lệnh sau:

htpasswd.exe -c

.htpasswd username2

rồi lại nhập mật khẩu vào tương tự như trước. Lặp lại bước này đến khi hết số lượng người dùng.

Khi hoàn tất, trong thư mục bin đó sẽ xuất hiện tệp .htpasswd, trong đó chứa tên người dùng và mật khẩu tương ứng. Mở tệp này bằng Notepad hoặc bằng 1 chương trình đọc file bất kỳ sẽ thấy nó có dạng username:password, trong đó username là tên người dùng không được mã hóa, còn password là mật khẩu tương ứng đã được mã hóa.

Sau đó hãy chép tệp .htpasswd vừa tạo ra này vào thư mục mà bạn muốn bảo vệ bằng mật khẩu, giả sử thư mục ở máy mình là C:/www/thuchanh.

Trong thư mục này, hãy tạo ra 1 tệp có tên .htaccess (cũng chỉ có phần mở rộng mà không có phần tên). Tệp này có vai trò xác lập các tham số cần thiết để thiết lập quyền truy cập trang web nằm trong thư mục trên. Nội dung của tệp này, bạn tạo ra bằng bất kỳ 1 chương trình soạn thảo văn bản nào (như Notepad chẳng hạn) với nội dung như sau:

AuthType Basic
AuthName “Enter password”
AuthUserFile C:/www/thuchanh/.htpasswd
require valid-user

Dòng đầu tiên là kiểu xác nhận, ở đây là Basic. Dòng thứ 2 là tiêu đề của cửa sổ sẽ hiện ra hỏi tên và mật khẩu, có thể là bất cứ thứ gì bạn muốn. Dòng thứ 3 rất quan trọng, đó là đường dẫn đến tệp chứa tên và mật khẩu (chính là file .htpasswd đã nói ở trên). Đường dẫn này có thể tương đối đối với thư mục gốc, hoặc có thể tuyệt đối. Trong trường hợp này mình dùng đường dẫn tuyệt đối. Dòng cuối cùng là yêu cầu chỉ chấp nhận với những người dùng hợp lệ, tức tên và mật khẩu hợp lệ.
Bây giờ mở trình duyệt ra, nhập đường dẫn đến thư mục được bảo vệ (hoặc 1 trang web bất kỳ đặt trong thư mục đó), trong trường hợp của mình là http://localhost/thuchanh, bạn sẽ nhận được 1 cửa sổ yêu cầu nhập tên và mật khẩu. Hãy nhập tên và mật khẩu bạn tạo ra ở trong file .htpasswd lúc đầu. Bạn sẽ vào được thư mục đó (hoặc trang web trong thư mục đó).

Chú ý là nếu 2 tệp .htaccess và .htpasswd đặt ở thư mục nào thì thư mục đó cùng với tất cả các tệp và các thư mục con trong nó đều được bảo vệ.ư

Theo kênh 360

Nguồn : Cách đặt mật khẩu cho trang web hay thư mục trong website

Thứ Sáu, 28 tháng 1, 2011

Định nghĩa background cho một thẻ trong CSS

Thuộc tính background trong CSS, nó sẽ cho phép chúng ta tùy biến màu nền của một thẻ HTML đặt một ảnh làm nền (background), làm cho một ảnh có thể lặp đi lặp lại (repeat) theo chiều ngang hoặc theo chiều dọc, chúng ta cũng có thể định vị một ảnh ở một vị trí nào đó trên trang.

Thuộc tính background bao gồm:

background-color:#ffffff; /*màu nền*/
background-image:url(css_series.jpg); /*ảnh nền*/
background-repeat:repeat-x; /*Lặp lại*/
background-position: center bottom; /*Vị trí*/

Hoặc ta có thể khai báo gộp lại như sau

background: #ffffff url(css_series.jpg) repeat-x center bottom;

Trong đó:

+ Màu nền bạn có thể khai báo bằng mã màu hoặc tên màu ví dụ như #ffffff hoặc white đều được định nghĩa cho màu trắng

+ Ảnh nền bạn phải chỉ ra đường dẫn đến ảnh đó.

+ Lặp lại bạn có thể cho lặp lại theo hàng ngang (repeat-x), hàng dọc (repeat-y), không lặp lại (no repeat).

Theo laptrinhvn

Thuật toán tính hàm mũ

Trong Pascal ta có thể tính a^b bằng công thức exp(b*ln(a)). Tuy nhiên nếu a không phải là số dương thì không thể áp dụng được.

Ta có thể viết hàm mũ an như sau:

function hammu(a : real; n : integer): real;
var s : real;
i : integer;
begin
s := 1;
for i := 1 to n do s := s * a;
hammu := s;
end;
Theo lập trình vn

Thuật toán nhập và in mảng 2 chiều dạng ma trận

Chương trình thực hiện nhập và in mảng 2 chiều dạng ma trận (m dòng, n cột)

1. Nhập

Để nhập các phần tử của mảng 2 chiều dạng ma trận, ta cần dùng các lệnh sau của unit CRT (nhớ phải có khai báo user crt ở đầu chương trình).

GotoXY(a,b): di chuyển con trỏ màn hình đến vị trí (a,b) trên màn hình (cột a, dòng b). Màn hình có 80 cột và 25 dòng.
whereX: hàm cho giá trị là vị trí cột của con trỏ màn hình.

whereY: hàm cho giá trị là vị trí dòng của con trỏ màn hình.

Khi nhập 1 phần tử ta dùng lệnh readln nên con trỏ màn hình sẽ xuống dòng, do đó cần quay lại dòng của bằng lệnh GotoXY(j * 10, whereY -1 ), nếu ta muốn mỗi phần tử của ma trận ứng với 10 cột màn hình.

procedure nhap;
var i,j : integer;
begin
clrscr;
write('Nhap m,n = ');
readln(m,n);
for i := 1 to m do begin
for j := 1 to n do begin
write('A[',i,',',j,']=');
readln(a[i,j]);
gotoXY(j*10,whereY-1);
end;
writeln;
end;
end;

2. In

Để in bảng dạng ma trận, với mỗi dòng ta sẽ in các phần tử trên 1 hàng rồi xuống dòng:

procedure inbang;
var i,j : integer;
begin
for i := 1 to m do begin
for j := 1 to n do
write(a[i,j]:6);
writeln;
end;
end;
Theo lập trình vn

Thuật toán tính tổng ước số của số nguyên

Để tính tổng các ước số của số n, ta cho i chạy từ 1 đến n div 2, nếu n chia hết cho số nào thì ta cộng số đó vào tổng. (Chú ý cách tính này chưa xét n cũng là ước số của n).

Chương trình:

function tongus(n : integer): integer;
var i,s : integer;
begin
s := 0;
for i := 1 to n div 2 do
if n mod i = 0 then s := s + i;
tongus := s;
end;
Theo lập trình vn

Thuật toán tô màu SDO

Thuật toán SDO (Saturation Degree Ordering) : do Brèlaz đề xuất năm 1979 [12]. Đây cũng là một thuật toán tô mầu tuần tự các đỉnh. SDO cải tiến FF ở chỗ các đỉnh được tô mầu không theo số thứ tự của đỉnh, mà theo thứ tự bậc SD từ lớn tới bé. Trong đó bậc SD của đỉnh x được tính bằng số mầu khác nhau đã dùng để tô cho các đỉnh kề với x.

Chương trình:

#include
#include
#include
int *doc_tep(int *a,int *n);
void in_matran(int *a,int n);
int *bac_dinh(int *a,int n);
int max(int *b,int n);
int ktra_mau(int *a,int *b,int *c,int n,int x);
void ToMau(int *a,int n);
int main()
{
int n,*a;
a=doc_tep(a,&n);
in_matran(a,n);
ToMau(a,n);
getch();
return 0;
}
int *doc_tep(int *a,int *n)
{
FILE *f;
f=fopen("Graph1.INP","r");
if(f==NULL)
{
printf("nLoi Mo Tep.");
getch();
exit(1);
}
fscanf(f,"%d",n);
a=(int *) malloc(*n**n*sizeof(int));
for(int i=0;i<*n;i++)
for(int j=0;j<*n;j++)
fscanf(f,"%d",(a+i**n+j));
fclose(f);
return a;
}
void in_matran(int *a,int n)
{
for(int i=0;i
{
for(int j=0;j
printf("%5d",*(a+i*n+j));
printf("nn");
}
}
int *bac_dinh(int *a,int n)
{
int *deg;
int *b;
b=(int *) calloc(n*n,sizeof(int));
for(int i=0;i
for(int j=0;j
if(*(a+i*n+j)!=0)
{
*(b+i*n+j)=*(a+i*n+j);
*(b+j*n+i)=*(a+i*n+j);
}
printf("n");
//in_matran(b,n);
deg=(int *) calloc(n,sizeof(int));
for(int i=0;i
for(int j=0;j
{
if(*(b+i*n+j)!=0 && i!=j)
deg[i]+=*(b+i*n+j);
if(*(b+i*n+j)!=0 && i==j)
deg[i]+=*(b+i*n+j)*2;
}
//for(int i=0;i
// printf("nBac cua dinh %d la %d.",i+1,deg[i]);
return deg;
}
int max(int *b,int n)
{
int tg=*b,j=0;
for(int i=1;i
if(*(b+i)>tg)
{
tg=*(b+i);
j=i;
}
return j;
}
int ktra_mau(int *a,int *b,int *c,int n,int d,int x) //Kiem tra mau x da to cho cac dinh ke voi dinh d chua
{
for(int j=0;j
if((*(a+d*n+j)!=0 && j!=d) && *(b+j)==x) //c[]:danh dau dinh j da to mau
return 0; //b[]
return 1;
}
void in(int *b,int n)
{
printf("n");
for(int k=0;k
printf("%5d",*(b+k));
}
void ToMau(int *a,int n)
{
int *b,*c,*deg,tg;
b=(int *) calloc (n,sizeof(int));
c=(int *) calloc (n,sizeof(int));
deg=bac_dinh(a,n);
for(int i=0;i
{
tg=max(deg,n);
printf("ntg=%d",tg);
for(int j=0;j
if(ktra_mau(a,b,c,n,tg,j)==1)
{
*(b+tg)=j;
*(c+tg)=1;
break;
}
*(deg+tg)=0;
//in(deg,n);
}
printf("nTo Mau Cho Do Thi: n");
for(int i=0;i
printf("ntDinh %d ---> Mau %d",i+1,*(b+i));
}
Theo lập trình việt