Academia.eduAcademia.edu
Cơ sở dữ liệu – SQL Server 2005 (SQL Server 2005 Dev Edition) – SP3, SQL Server Express 2005, SQL Server 2008. Phân tích thiết kế hệ thống: + Xác định mục đích, phạm vi bài toán + Xác định hệ thống các chức năng của hệ thống + Xác định dữ liệu của bài toán – liệt kê các trường dữ liệu, liệt kê các thực thể, bảng dữ liệu + Sơ đồ mức khung cảnh – tên hệ thống, các tác nhân + Sơ đồ luồng dữ liệu mức đỉnh. + Các sơ đồ luồng dữ liệu Tham khảo tài liệu của Nguyễn Văn Ba 3. Chương trình tạo một cửa sổ đầu tiên Ví dụ 1: Viết chương trình tạo một cửa sổ trên Windows. Các bước thực hiện: + Chạy Visual Studio, vào mục file chọn New Solution, trong cửa sổ hiện ra chọn mục ngôn ngữ là Visual C++. Chọn Project Type là Win32 Application. Gõ tên của Solution và Project là Vidu1, chọn đường dẫn lưu và nhấn vào OK. Tiếp đến chọn mục Application Settings, đánh dấu vào ô Empty Project rồi nhấn vào Finish. Sau bước này ta đã có 1 thư mục lưu Solution và Project cho ứng dụng. Nhấn vào mục Source Files chọn Add, New Item. Tiếp đến chọn C++ File, gõ tên file là vidu1.c và nhấn vào Add. Cửa sổ soạn thảo chương trình sẽ hiện ra để chúng ta gõ mã lệnh cho file vidu1.c. Gõ chương trình như sau: #include <windows.h> const char g_szClassName[] = "Lop cua so"; // khai báo hàm xử lý thông điệp cửa sổ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hwnd; MSG Msg; //Step 1: Registering the Window Class wc.cbSize        = sizeof(WNDCLASSEX); wc.style         = 0; wc.lpfnWndProc   = WndProc; wc.cbClsExtra    = 0; wc.cbWndExtra    = 0; wc.hInstance     = hInstance; wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor       = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName  = NULL; wc.lpszClassName = g_szClassName; wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Khong dang ky duoc lop cua so!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } // Step 2: Creating the Window hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, g_szClassName, TEXT("Tieu de"),WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if(hwnd == NULL) { MessageBox(NULL, "Khong tao duoc cua so!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // step 3: Message Loop while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; } // Step 4: the Window Procedure LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } Chương 2: Hệ thống file và thư mục (trên Windows) Truy cập hệ thống file và thư mục trên Windows Các hệ thống định dạng File và thư mục: + Hệ thống (định dạng) NTFS (NT – New Technology File System), định dạng duy nhất được MS tập trung phát triển với các tính năng ưu việt sau: bảo mật, nén, mã hóa, khôi phục khi bị lỗi (Fault Tolerant), thiết bị có dung lượng lớn. Các hệ thống phần cứng có ổ đĩa (đĩa mềm, CD, DVD, USB) không hỗ trợ NTFS, các hệ điều hành Win 9x không hỗ trợ NTFS. + Định dạng FAT (File Allocation Table) bao gồm FAT (16 bit) và FAT32 (32 bit). FAT là định dạng phát triển từ MS-DOS và Win 3.1. FAT32 bắt đầu được đưa ra từ phiên bản Win 98. Không hỗ trợ khả năng mã hóa, chịu lỗi, nén, bảo mật. + CDFS (CD – File System) dành cho các đĩa CD. + Định dạng UDF (Universal Disk Format) dành cho các đĩa DVD, bắt đầu từ Windows XP. Để truy cập vào các file và thư mục của Windows có 2 cách: + Sử dụng các hàm được ngôn ngữ C hỗ trợ (không khuyến khích – không dành riêng cho Windows, không hỗ trợ các tính năng cao cấp trong truy cập file và thư mục trên Windows). + Dùng các hàm API của Windows Ví dụ 1: Copy file tuần tự sử dụng các hàm của C. Các hàm sẽ sử dụng: fopen(), fclose(), fread(), fwrite(). Ví dụ 2: Viết chương trình copy file sử dụng các hàm API của Windows. Các hàm sẽ sử dụng: CreateFile() – mở, tạo file, ReadFile() – đọc file, WriteFile() – ghi file. Để quản lý các đối tượng trong 1 chương trình trên Windows ta sử dụng các biến HANDLE. Quản lý file và thư mục nâng cao (học ngày 10/9/2010) Các hàm quản lý file Hàm xóa file: BOOL DeleteFile(LPCTSTR lpFileName) LPCTSTR: LONG POINTER CONST STRING – kiểu xâu, con trỏ, hằng số. Hàm copy file: BOOL CopyFile(LPCTSTR lpSourceFile, LPCTSTR lpNewFile, BOOL fFailIfExist); // không copy nếu file đã tồn tại. Hàm move file: BOOL MoveFile(LPCTSTR lpSourceFile, LPCTSTR lpNewFile); // không move nếu file đã tồn tại. BOOL MoveFileEx(LPCTSTR lpSourceFile, LPCTSTR lpNewFile, DWORD dwFlags); // vẫn move file nếu file đã tồn tại. Chú ý: Chỉ các hàm MoveFile() và MoveFileEx() là có thể làm việc cả với file và thư mục. Các giá trị có thể có của biến dwFlags (hằng số): + MOVEFILE_REPLACE_EXISTING: ghi đè + MOVEFILE_WRITETHROUGH: đảm bảo hàm chỉ kết thúc khi đã ghi lên đĩa. + MOVEFILE_COPY_ALLOWED: sử dụng hàm CopyFile() sau đó là DeleteFile() + MOVEFILE_DELAY_UNTL_REBOOT: chỉ copy sau khi hệ thống khởi động lại, chỉ gọi được với quyền là administrator. Chú ý: các ký tự thay thế đặc biệt (Wildcard) không được sử dụng với tham số của các hàm trên. Ví dụ: #include <Windows.h> #include <stdio.h> int main(int argc, LPTSTR args[]) { BOOL flag; printf("%s", args[0]); if(argc!=3) { printf("Chuong trinh can ten file nguon va file dich muon copy:"); system("pause"); return 1; } CopyFile(args[1], args[2],&flag); system("pause"); return 0; } Quản lý thư mục Tạo thư mục: BOOL CreateDirectory(LPCTSTR lpDirName, LPSECURITY_ATTRIBUTES lpSecAttrib); Xóa thư mục: BOOL RemoveDirectory(LPCTSTR lpDirName); Thiết lập thư mục hiện thời: BOOL SetCurrentDirectory(LPCTSTR lpDirName); Hàm lấy thư mục hiện thời: DWORD GetCurrentDirectory(DWORD cchCurDir, LPTSTR lpCurDir); Giá trị trả về là độ dài của đường dẫn thư mục, biến cchCurDir là độ dài của bộ đệm lưu đường dẫn, lpCurDir lưu đường dẫn. Các hàm lấy thuộc tính của file và thư mục Hàm tìm kiếm file trong thư mục hiện thời: HANDLE FindFirstFile(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpffd); Hàm này thực hiện tìm kiếm tên file và thư mục con trong thư mục hiện thời. LPWIN32_FIND_DATA là cấu trúc dữ liệu để lưu thuộc tính file và thư mục trên Windows. Sau khi thực hiện hàm trên, có thể sử dụng kết quả là HANDLE lấy được để gọi tới hàm FindNextFile(): HANDLE FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpffd); Khi kết thúc tìm kiếm, để đóng các file dùng hàm: BOOL FindClose(HANDLE hFindFile); Ngoài ra còn một số hàm khác như GetFileTime(), GetFileAttributes(). Bài tập – Thực hành: In ra danh sách file và thư mục trong thư mục hiện thời In ra danh sách tất cả các file và thư mục trong thư mục hiện thời. Chương 3: Hệ thống CSDL Registry Khái niệm Registry: là cơ sở dữ liệu lưu trữ thông tin về tất cả các chương trình, cấu hình của các chương trình trên hệ điều hành. Registry được tổ chức thành mục – danh mục (hive), trong các mục này có khóa (key – entry), mỗi khóa có kiểu (type) và giá trị (value). Việc truy cập tới các khóa của Registry có thể được thực hiện thông qua các chương trình hệ thống: regedit, autoruns, hoặc các hàm API của Windows. Các cặp kiểu/giá trị trong CSDL Registry chứa các thông tin sau: + Các thông tin về hệ điều hành và người dùng + Các thông tin tương tự về các chương trình cài trên hệ thống. + Các thông tin cấu hình của người dùng và các chương trình (màn hình nền, ảnh người dùng …). + Các thông tin về các dịch vụ + Các thông tin ánh xạ từ tên chương trình tới file thực thi + Các thông tin ánh xạ các địa chỉ mạng (ổ đĩa …) Chương 4: Tiến trình (process) và luồng (thread) Tiến trình Ví dụ 1: Sử dụng hàm CreateProcess để chạy một chương trình từ chương trình (create process). #include <windows.h>  #include <stdio.h>  int main(void)  { STARTUPINFO          si = { sizeof(si) }; PROCESS_INFORMATION  pi; char                 szExe[] = "cmd.exe"; if(CreateProcess(0, szExe, 0, 0, FALSE, 0, 0, 0, &si, &pi)) { // optionally wait for process to finish WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } system("pause"); return 0; } Disable USB Autorun #include <windows.h>  #include <stdio.h>  // Disable USB Autorun by set Registry Value via Win32 RegSetValueEx() int main(void)  {  HKEY hKey; DWORD dwDisp = 0; LPDWORD lpdwDisp = &dwDisp; unsigned char l_strExampleKey[MAX_PATH] = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\IniFileMapping\\Autorun.inf"; /*unsigned char l_strDWordSample[MAX_PATH] = "@";*/ unsigned char dwVal[MAX_PATH] = "@SYS:DoesNotExist"; LONG iSuccess = RegCreateKeyEx(HKEY_LOCAL_MACHINE, l_strExampleKey, 0L,NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey,lpdwDisp); if(iSuccess == ERROR_SUCCESS) { RegSetValueEx (hKey, "", 0L, REG_SZ,(const unsigned char*)dwVal, sizeof(dwVal)); RegCloseKey(hKey); } system("pause"); return 0; }   Ví dụ 2: Liệt kê tất cả các tiến trình đang chạy trên hệ thống và in ra tên, PID, bộ nhớ sử dụng của chúng (ProcessExplorer). Các hàm sử dụng: EnumProcess(), GetModuleFileName() nằm trong thư viện psapi.h (psapi.lib). Hàm tắt một tiến trình: KillProcess(). #include <windows.h> #include <stdio.h> #include <tchar.h> #include <psapi.h> void PrintProcessNameAndID(DWORD processID ) { TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); // Get a handle to the process. HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); PROCESS_MEMORY_COUNTERS_EX info; info.cb = sizeof(info); // Get the process name. if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; BOOL okay; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),  &cbNeeded) ) { GetModuleBaseName( hProcess, hMod, szProcessName,  sizeof(szProcessName)/sizeof(TCHAR) ); } okay = GetProcessMemoryInfo(hProcess, (PROCESS_MEMORY_COUNTERS*)&info, info.cb); } // Print the process name and identifier. _tprintf( TEXT("%s:  (PID: %u), Mem usage %u\n"), szProcessName, processID,info.PrivateUsage/1024); CloseHandle( hProcess ); } int main() { // Get the list of process identifiers. DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) return; // Calculate how many process identifiers were returned. cProcesses = cbNeeded / sizeof(DWORD); // Print the name and process identifier for each process. for (i = 0;i < cProcesses;i++) if(aProcesses[i] != 0) PrintProcessNameAndID(aProcesses[i]); system("pause"); return 0; }